我有以下项目结构:
project
|----app.py
|----package
|---__init__.py
|---module.py
|---module2.py
|---module3.py
|---....
我的__init__.py
文件目前为空。在module.py中,我有一个类的定义:
class UsefulClass:
...
在其他模块中也有类似的定义。我的app.py看起来像这样:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from package.module import UsefulClass
from package.module2 import UsefulClass2
...
usefulclass = UsefulClass()
usefulclass2 = UsefulClass2()
....
我的问题是:如何替换此from package.module... import UsefulClass
语句?即使是现在,我只定义了4个模块,这些导入开始看起来很难看。我可以在__init__.py
文件中导入它们,然后在import package
中使用app.py
吗?我试过了,它给了我一个错误。
我正在寻找一个干净而优雅的解决方案。
答案 0 :(得分:1)
在Python 3中:
package/__init__.py
:
from .foo import bar
package/foo.py
:
bar=0
app1.py
:
import package
print(package.bar)
app2.py:
from package import bar
print(bar)
无论哪种方式,都可以按照您的意愿打印0
。
在Python 2中,只需将from .foo import bar
更改为from foo import bar
。
(事实上,2.x代码通常在Python 3中有效,但它不正确,在某些边缘情况下它会失败。例如,如果你的bar.py
与{3}处于同一级别应用,您最终将bar
作为该模块,而不是0
。)
在现实生活中,您可能希望从每个包和模块中指定一个__all__
,您可能from foo import …
(除非允许在交互式解释器中使用{进行测试)。 {1}})。
听起来你说你已经尝试过这个,并且出错了。如果不知道完全你尝试了什么,错误是什么,以及你正在使用哪个Python版本,我根本不知道你可能会遇到什么错误,但可能你有的东西错了。
from foo import *
指定包相对导入。说.foo
表示“来自与我相同的包中的from .foo import bar
模块,导入foo
”。如果你不在这里,你会说“从标准模块路径中的bar
模块,导入foo
”。
关于Intra-package References(以及周边部分)的教程部分给出了一个非常简短的解释。 import
和the import system in general的参考文档提供了大部分详细信息,但PEP 328中的原始提案解释了详细信息以及设计背后的基本原理,更简单。
你需要在2.x中留下点的原因是2.x无法区分相对和绝对导入。只有bar
,这意味着“来自与我相同的包的from foo import bar
模块,或者,如果没有这样的模块,那么标准模块路径中的模块,导入foo
”