2

这是我的文件夹:

/Workspace
 somefiles.py
          /foopackage
           __init__.py
           foo1.py
           foo2.py

_ init _ .py包含

from foo1 import foo1
from foo2 import foo2

我想导入 foopackage。我试过这个:

>>>import sys
>>>sys.path.append('/home/username/Workspace')
>>>import foopackage
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/username/Workspace/foopackage/__init__.py", line 1, in <module>
    from foo1 import foo1
ImportError: No module named 'foo1'

我已经尝试 sys.path.append('/home/username/Workspace/foopackage') 代替并且事情已修复。

我问我是否必须将每个包目录添加到 sys.path 列表才能导入它们?
还是有其他问题?

4

1 回答 1

5

如果您使用的是 Python 3,则需要使用显式的相对导入,而不是隐式导入,这在 Python 2 中曾经有效。尝试将foopackage's__init__.py文件更新为:

from .foo1 import foo1
from .foo2 import foo2

前导.字符告诉 Pythonfoo1并且foo2是兄弟模块,而不是您所指的绝对顶级模块。另一种方法是使用对它们的绝对引用:

from foopackage.foo1 import foo1
from foopackage.foo2 import foo2

但就个人而言,我认为这有点过分。如果您在将来某个时候更改包名称(或移动为其他某个包的子包),它也会中断。

有关相对进口变化的更多详细信息,请参阅PEP 328

于 2013-10-04T23:01:44.050 回答