Python — импорт классов пакетов в глобальное пространство имен консоли

У меня возникли проблемы с тем, чтобы мои классы Python работали в консоли Python. Я хочу автоматически импортировать все свои классы в глобальное пространство имен, чтобы я мог использовать их без префикса .module.names.

Вот что у меня пока есть...

projectname/
|-__init__.py
|
|-main_stuff/
  |-__init__.py
  |-main1.py
  |-main2.py
  |
  |-other_stuff/
    |-__init__.py
    |-other1.py
    |-other2.py

Каждый файл определяет класс с тем же именем, например. main1.py определит класс с именем Main1.

Мой PYTHONPATH — это абсолютный путь к projectname/.

У меня есть файл запуска Python, который содержит это:

from projectname import *

Но это не позволяет мне вообще использовать мои классы. После запуска консоли Python я хотел бы иметь возможность писать:

ob=Main1()

но Main1 не находится в текущем пространстве имен, поэтому он не работает.

Я попытался добавить что-то в файлы __init__.py...

In projectname/__init__.py:

import main_stuff

In projectname/main_stuff/__init__.py:

import other_stuff
__all__ = ["main1", "main2", "main3"]

И так далее. И в моем файле запуска я добавил:

from projectname.main_stuff import *
from projectname.main_stuff/other_stuff import *

Но чтобы использовать классы в консоли Python, мне все равно нужно написать:

ob=main1.Main1()

Я бы предпочел не нуждаться в части main1.. Кто-нибудь знает, как я могу автоматически помещать свои классы в глобальное пространство имен при использовании консоли Python?

Спасибо.

==== РЕДАКТИРОВАТЬ ====

Мне нужно импортировать пакет на уровне класса, но from package import * дает мне все на уровне модуля. Мне нужен простой способ сделать что-то вроде этого:

for module in package do:
    from package.module import *

==== ДРУГОЕ РЕДАКТИРОВАНИЕ ====

В итоге я добавил импорт класса в свой файл запуска python по отдельности. Это не идеально из-за накладных расходов на его обслуживание, но оно делает то, что я хочу.

from class1.py import Class1
from class2.py import Class2
from class3.py import Class3

person Fish    schedule 30.09.2009    source источник


Ответы (1)


Вы хотите использовать другую форму импорта.

In projectname/main_stuff/__init__.py:

from other_stuff import *
__all__ = ["main1", "main2", "main3"]

Когда вы используете такое утверждение:

import foo

Вы определяете имя foo в текущем модуле. Затем вы можете использовать foo.something, чтобы добраться до материала в foo.

Когда вы используете это:

from foo import *

Вы берете все имена, определенные в foo, и определяете их в этом модуле (например, заливаете ведро имен из foo в свой модуль).

person Ned Batchelder    schedule 30.09.2009