【问题标题】:Python relative import to invoke script from random directoryPython相对导入从随机目录调用脚本
【发布时间】:2012-06-21 00:05:42
【问题描述】:

我的目录结构如下:

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 是要走的路吗?

【问题讨论】:

    标签: python import pythonpath relative-import


    【解决方案1】:

    问题在于execfile 会将您调用的文件评估为纯python 代码。 b.py 中的每个相对导入语句(以及由它导入的任何包模块)都必须与您的调用脚本保持一致。

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

    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')
    

    【讨论】:

    • 我有__init__.py。它仍然不起作用。当我第三个脚本使用 execfile 调用 b.py 时,__file__ 不好。 print __file__ 打印其他文件的名称。
    • @iamrohitbanga:我认为,如果您尝试允许脚本execfile 依赖于其他模块的包中的模块,那么无论如何您都会遇到问题。 execfile 评估模块的纯代码,因此模块中相关的所有内容在执行脚本中也必须类似地是相对的
    • 我猜你是对的。我想我需要四处寻找更方便的构建环境解决方案。
    • @iamrohitbanga:我只是重写了我的答案
    猜你喜欢
    • 2020-03-21
    • 2020-03-28
    • 2021-08-15
    • 1970-01-01
    • 2016-08-01
    • 2012-05-03
    • 2020-10-27
    • 2012-05-28
    相关资源
    最近更新 更多