Python - 将包类导入控制台全局命名空间

11 投票
1 回答
12659 浏览
提问于 2025-04-15 14:42

我在使用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文件中添加一些内容……

projectname/__init__.py中:

import main_stuff

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

1 个回答

21

你想用一种不同的导入方式。

projectname/main_stuff/__init__.py 文件里:

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

当你使用这样的语句时:

import foo

你是在当前模块里定义了一个叫 foo 的名字。然后你可以用 foo.something 来访问 foo 里的内容。

当你使用这个:

from foo import *

你是在把 foo 里定义的所有名字都引入到这个模块里(就像把一个装满名字的桶倒进你的模块里)。

撰写回答