我需要PYTHONPATH吗?

问题描述 投票:1回答:1

关于PYTHONPATH和进口有很多类似的问题,但我找不到我需要的东西。

我有一个包含一些python帮助程序脚本的git存储库。脚本自然地组织在几个包中。就像是:

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中工作,默认情况下当前dir在classpath中,但似乎并非如此。我也试过相对导入而没有成功。

编辑:如果我删除顶级__init__.py似乎工作

python import pythonpath
1个回答
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
  • 然后执行模块的正常导入
© www.soinside.com 2019 - 2024. All rights reserved.