我有以下目录结构:
test1/
test1/a.py
test1/test2/b.py
b.py需要导入a.py中的类。所以我可以在导入 a 之前将以下行添加到 b.py 中。
sys.path.append(os.path.dirname(sys.argv[0]) + "/..")
这有效,我可以从任何目录调用 b.py 并且它能够导入 a. 但是当我在另一个目录中编写脚本以使用 execfile() 调用该文件时,这会失败。
我尝试了相对导入,但收到“尝试在非包中进行相对导入错误”
from ..a import someclass as cls
我在 test1 和 test2 中都有 __init__.py
有人知道如何让它发挥作用吗? PYTHONPATH 是正确的选择吗?
最佳答案
问题是 execfile
会将您调用的文件评估为纯 python 代码。 b.py
中的每个相对导入语句(以及由它导入的任何包模块)都必须与您的调用脚本保持一致。
一种解决方案是不在包内使用任何相对导入路径。确保 test1
包也在您的 PYTHONPATH 上。
b.py
from test1 import a
在 PYTHONPATH 中添加 test1
后,a
的导入应该会在 execfile
中成功
>>> import sys
>>> sys.path.append('/path/to/parent/of_test1')
>>> execfile('/path/to/parent/of_test1/test1/test2/b.py')
关于Python 相对导入以从随机目录调用脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11092693/