关于PYTHONPATH和导入有很多类似的问题,但是我没有找到我真正需要的东西。
我有一个git存储库,其中包含一些python帮助程序脚本。这些脚本自然地组织在几个软件包中。像这样:
scripts/main.py
scripts/other_main.py
scripts/__init__.py
a/foo.py
a/bar.py
a/__init__py
b/foo.py
b/bar.py
b/__init__.py
__init__.py
scripts
取决于a
和b
。我在所有模块中都使用绝对导入。我运行python3 scripts/main.py
。只要我将PYTHONPATH
设置到项目的根目录,一切都将起作用。
但是,我想避免用户设置环境变量的麻烦。
正确的方法是什么?我希望这可以像在Java中那样工作,默认情况下,当前目录默认位于类路径中,但事实并非如此。我也尝试过相对导入但没有成功。
编辑:如果我删除顶级__init__.py
答案 0 :(得分:2)
首先,您是对的,因为我认为您不需要顶层__init__.py
。删除它并不能解决我的任何导入错误。
您无需设置PYTHONPATH,我可以想到一些替代方法:
使用虚拟环境(https://virtualenv.pypa.io/en/latest/)。这还需要您将代码打包到可安装的软件包(https://packaging.python.org/)中。由于该选项与您的问题没有直接关系,因此我将不做进一步解释。
将模块移动到scripts
目录下。 Python自动将脚本目录添加到Python路径中。
修改脚本中的sys.path
变量,以便他们可以找到您的本地模块。
第二个选项是最简单的。
第三个选项将要求您在正常导入的上方脚本顶部添加一些python代码。在您的main.py
中,它看起来像:
#!/usr/bin/env python
import os.path, sys
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
import a
import b
这是什么:
获取脚本的文件名
计算脚本目录的父目录
将该目录添加到sys.path
然后正常导入模块