Python高级导入问题

时间:2014-11-15 13:28:21

标签: python import

我正在尝试制作我的第一个高级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)。

1 个答案:

答案 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 importThis 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中所解释的那样。

希望这很有用。