Python相对导入从随机目录调用脚本

时间:2012-06-18 23:58:03

标签: python import pythonpath relative-import

我有以下目录结构:

test1/
test1/a.py
test1/test2/b.py

b.py需要在a.py中导入一个类。所以我可以在导入。

之前将以下行添加到b.py.

sys.path.append(os.path.dirname(sys.argv [0])+“/..")

这有效,我可以从任何目录调用b.py,并且可以导入。 但是当我在另一个目录中编写脚本以使用execfile()调用此文件时,这会失败。

我尝试了相对导入,但是我得到了“非包装错误中尝试相对导入”

from ..a import someclass as cls

我在test1,test2

中都有__init__.py

有人知道如何让它发挥作用吗? PYTHONPATH是可行的吗?

1 个答案:

答案 0 :(得分:1)

问题是execfile会将您调用的文件评估为纯Python代码。 b.py内的每个相对import语句(以及由它导入的任何包模块)都必须保持对您的调用脚本的真实性。

一种解决方案是不在包中使用任何相对导入路径。确保您的PYTHONPATH上还有test1包。

<强> b.py

from test1 import a

在您的PYTHONPATH中test1a

成功导入execfile
>>> import sys
>>> sys.path.append('/path/to/parent/of_test1')
>>> execfile('/path/to/parent/of_test1/test1/test2/b.py')