如何在Python中实现相对导入
考虑一下:
stuff/
__init__.py
mylib.py
Foo/
__init__.py
main.py
foo/
__init__.py
script.py
script.py
想要导入 mylib.py
。
这只是一个例子,但我其实想在父目录中相对导入一个模块。我尝试了各种方法,但遇到了这个错误……
尝试进行超出顶层包的相对导入
我在某个地方看到过,程序开始运行的脚本不应该放在包里面,所以我尝试像这样修改结构……
stuff/
mylib.py
foo.py // Equivalent of main.py in above
foo/
__init__.py
script.py
但是我还是得到了同样的错误。
我该怎么做才能实现这个呢?这样做合适吗?
在 Python 2 中。
5 个回答
7
我在Windows 7上运行Python 3.4.2,搞得我头都疼。
当我运行以下命令时:
python -m unittest python -m unittest discover
我总是遇到“尝试进行超出顶层包的相对导入”的错误。
对我来说,解决办法是把我的[test_stock.py]文件中的“..”去掉。原来的代码是: from ..stock import Stock
我把它改成了: from stock import Stock
这样就可以正常工作了。
文件夹结构:
C:\
|
+-- stock_alerter
|
+-- __init__.py
+-- stock.py
|
\-- tests
|
+-- __init__.py
\-- test_stock.py
14
只要“stuff”不在你的Python路径中,你就没有其他选择,只能添加这个路径。
如果你知道你的 script.py 文件和“stuff”之间的层级关系,你可以这样做,例如:
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
29
经过一番折腾,我终于搞明白了怎么设置这些东西。为了更具体一点,我不打算用那些常见的名字。我的项目目录是这样设置的...
tools/
core/
object_editor/
# files that need to use ntlib.py
editor.py # see example at bottom
__init__.py
state_editor/
# files that need to use ntlib.py
__init__.py
ntlib.py
__init__.py # core is the top level package
LICENSE
state_editor.py # equivalent to main.py for the state editor
object_editor.py # equivalent to main.py for the object editor
在 object_editor.py
文件里,有一行代码看起来是这样的...
from core.object_editor import editor
在 editor.py
文件里,有一行代码看起来是这样的...
from .. import ntlib
或者可以是这样
from core import ntlib
关键是,在我提问时给出的例子中,“主”脚本是从包里面运行的。一旦我把它移出来,创建了一个特定的包(core
),并把我想让编辑器共享的库(ntlib
)放到那个包里,一切就顺利多了。