我正在尝试制作我的第一个高级python项目,但我很长时间没有进口。
有人能形容我在python中使用导入吗?在官方页面中发现有关python导入的文档对我来说并不那么充分......
以下是一个例子:
我有以下源结构:
$ ls -ltrR
.:
total 1
drwx------+ 1 Administrators None 0 Nov 15 14:09 b
-rwx------+ 1 Administrators None 24 Nov 15 14:10 a.py
./b:
total 6
-rwx------+ 1 Administrators None 0 Nov 15 14:08 c.py
-rwx------+ 1 Administrators None 16 Nov 15 14:10 __init__.py
drwx------+ 1 Administrators None 0 Nov 15 14:10 __pycache__
-rwx------+ 1 Administrators None 61 Nov 15 14:10 b.py
和文件的内容:
$ cat a.py
import b
b.B().printC()
$ cat b/b.py
import c
class B:
def printC(self):
print(c.C().get())
$ cat b/c.py
class C():
def get(self):
return 'This is C'
$ cat __init__.py
from .b import *
当我启动a.py时,它会说:ImportError: No module named 'c'
。
当我开始b.py时它只说一切都很好。
b.py中的另一个解决方案我将导入修改为"导入b.c" - >在这种情况下,当我调用a.py时它会起作用,但是当我只调用b.py时它不会起作用,因为b.py不知道b包。
为什么我还需要启动a.py和b.py? a.py应该是UT的执行者,而b.py应该是UT。 这就是为什么我想调用所有UT并启动a.py的原因,也可能发生我只是启动一个特定的UT(b.py)。
答案 0 :(得分:0)
在您的a.py中,不要只拥有import b
,请尝试from b import b
,因为您要从b模块导入b.py.
或者,在您的b / init .py中,有from b import *
但这是一个偏好问题(有关此主题的更多信息,请查看this thread)
This是一个很好的教程,可以开始使用模块和包。 (对于Python 2)
如果您使用的是Python 3,那么它有点不同。 Python 3不再支持隐式包名称导入。 This link很好地解释了这一点。因此,您需要使用相对导入明确提及包的实际位置 - from . import c
而不是import c
(在您的b.py中)和在.py:from b import b
中而不是import b
。
我们避免在a.py中使用相对导入,因为我们希望将其作为脚本运行。在Python 3中,只需运行一个使用相对导入的模块,作为脚本将抛出错误:SystemError: Parent module '' not loaded, cannot perform relative import
。 This link解释了此问题并提供了解决方案。如果要执行类似独立脚本的模块,可以使用-m标志:check the docs。
所以,在你的情况下:
a.py:
from b import b
b.B().printC()
b.py:
from . import c
class B:
def printC(self):
print(c.C().get())
c.py:没有变化
很好地明确引用您真正需要导入的模块/类/函数而不是导入整个模块,以提高查找效率。但是,如果您真的只想使用import b
导入整个“b”软件包而不是仅使用from b import b
从b软件包导入b.py模块,则需要包含所有模块意味着在b / init .py中的所有变量中发货,如下所示:
__all__ = ['b', 'c']
from . import *
正如this post中所解释的那样。
希望这很有用。