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

标签 python import pythonpath relative-import

我有以下目录结构:

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/

相关文章:

python - 将多列添加到 pandas 数据框

python - 从字符串中删除列表中存在的单词

Linux 上的 python : what are all the possible place where PYTHONPATH can be set?

javascript - 如何在 Electron JS 文件中导入另一个 JS 文件(位于同一目录中)

python - Jupyter 和 Python 中的 sys.path 不同 - 如何在 Jupyter 中导入自己的模块?

python - 为什么我的系统在显式设置后使用旧的 PYTHONPATH?

python - networkx - 以 block 的形式读取边缘列表(pandas)

python - 如何在CNN keras模型中将两个不同维度的输入(keras_tensor元素)相乘?

python - 来自 __future__ import absolute_import 不起作用?子模块不可见

xml - WordPress WXR 规范