Python 2.x vs 3.x导入,具体取决于调用/导入脚本的位置

时间:2018-02-06 12:31:46

标签: python python-3.x python-2.7 python-import

这可能是关于Python 2.x和3.x之间导入差异的第1000个问题,但对于我的具体问题/案例,我在阅读其中大​​部分内容后仍然陷入困境。考虑这个简单的例子:

目录结构:

main.py
src/
    thermo.py
    constants.py
    __init__.py  # empty

main.py:

import src.thermo as thermo
thermo.calc_thermo()

的src / thermo.py:

from constants import cp

def calc_thermo():
    print(2*cp)

if __name__ == '__main__':
    # Just for testing `thermo.py`
    calc_thermo()

的src / constants.py:

cp = 1234.

现在,有两种方法可以使用thermo.py;直接从src/子目录(用于此特定文件的调试/单元测试/ ..)调用它,或者通过将其导入main.py作为整个程序的一部分。通过上面的示例,这一切都在Python 2.7中运行,在Python3.x中我可以从thermo.py目录调用src/,但从thermo导入main.py会导致导入失败constants

这里有很多类似的问题,大多数建议用相对导入来解决这个问题,即改变thermo.py

from constants import cp

from .constants import cp

现在,如果我拨打main.py,它就可以了,但我无法直接从thermo.py目录拨打src/!如何最好地解决这个问题,即创建从其父目录(thermo.py)导入main.py的可能性,还可以直接从{{1}调用thermo.py }?

1 个答案:

答案 0 :(得分:1)

将环境变量PYTHONPATH设置为包含src目录(当然是其绝对路径)应该可以使导入在任何目录中运行。

必须在启动Python解释器之前设置此环境变量。