我需要PYTHONPATH吗

时间:2019-04-12 16:33:43

标签: python import pythonpath

关于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取决于ab。我在所有模块中都使用绝对导入。我运行python3 scripts/main.py。只要我将PYTHONPATH设置到项目的根目录,一切都将起作用。

但是,我想避免用户设置环境变量的麻烦。

正确的方法是什么?我希望这可以像在Java中那样工作,默认情况下,当前目录默认位于类路径中,但事实并非如此。我也尝试过相对导入但没有成功。

编辑:如果我删除顶级__init__.py

,它似乎可以工作

1 个答案:

答案 0 :(得分:2)

首先,您是对的,因为我认为您不需要顶层__init__.py。删除它并不能解决我的任何导入错误。

您无需设置PYTHONPATH,我可以想到一些替代方法:

  1. 使用虚拟环境(https://virtualenv.pypa.io/en/latest/)。这还需要您将代码打包到可安装的软件包(https://packaging.python.org/)中。由于该选项与您的问题没有直接关系,因此我将不做进一步解释。

  2. 将模块移动到scripts目录下。 Python自动将脚本目录添加到Python路径中。

  3. 修改脚本中的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

  • 然后正常导入模块