我有一个充满脚本的目录(比如说
project/bin
)。我还有一个位于
project/lib
的库,并希望脚本自动加载它。这是我通常在每个脚本的顶部使用的:
#!/usr/bin/python
from os.path import dirname, realpath, sep, pardir
import sys
sys.path.append(dirname(realpath(__file__)) + sep + pardir + sep + "lib")
# ... now the real code
import mylib
这有点麻烦、丑陋,并且必须粘贴在每个文件的开头。有没有更好的方法来做到这一点?
我真正希望的是像这样顺利的东西:
#!/usr/bin/python
import sys.path
from os.path import pardir, sep
sys.path.append_relative(pardir + sep + "lib")
import mylib
或者甚至更好,当我的编辑器(或具有提交访问权限的其他人) ) 决定重新排序导入作为其清理过程的一部分:
#!/usr/bin/python --relpath_append ../lib
import mylib
这不会直接移植到非 posix 平台,但它会保持干净。
有几种方法可以实现这一点,而不必在每个脚本中都写出路径操作:
1. 使用相对导入(仅限于包)
如果你打算将
project
构建成一个包,那么这是最干净和 Pythonic 的方法。
-
将
project
目录结构组织为包:project/ __init__.py bin/ script1.py script2.py lib/ __init__.py mylib.py
-
在
script1.py
和script2.py
中,使用相对导入:```python from ..lib import mylib
# ... 现在是真正的代码 mylib.some_function() ```
-
通过运行
pip install -e .
(在project
目录中)将project
安装为可编辑包。这会将project
放入sys.path
中。
这种方法的优点是代码更易读,并且鼓励良好的项目结构。但是,它要求你将
project
构建为一个包。
2. 使用
PYTHONPATH
环境变量
你可以设置
PYTHONPATH
环境变量来包含
project/lib
目录。
-
在你的 shell 中(或者在激活虚拟环境的脚本中):
bash export PYTHONPATH=$PYTHONPATH:/path/to/your/project/lib
-
现在你可以在你的脚本中直接导入
mylib
:python import mylib
这种方法的优点是简单,并且不需要修改你的脚本。缺点是它依赖于环境变量,这在某些情况下可能不方便。
3. 使用
.pth
文件
你可以创建一个
.pth
文件,其中包含要添加到
sys.path
的路径。
-
在你的 Python 安装的
site-packages
目录中创建一个名为myproject.pth
的文件(使用python -m site --user-site
找到该目录)。 -
在
myproject.pth
文件中,添加一行:/path/to/your/project/lib
-
现在你可以在你的脚本中直接导入
mylib
。
这种方法的优点是一劳永逸,不需要修改你的脚本或设置环境变量。缺点是它会影响所有使用该 Python 安装的项目。
4. 使用
sitecustomize
模块
你可以创建一个
sitecustomize.py
模块来自定义 Python 启动行为。
-
在你的 Python 安装的
site-packages
目录中创建一个名为sitecustomize.py
的文件。 -
在
sitecustomize.py
文件中,添加以下代码:python import sys sys.path.append('/path/to/your/project/lib')
-
现在你可以在你的脚本中直接导入
mylib
。
这种方法与使用
.pth
文件类似,但它为你提供了更大的灵活性,可以执行更复杂的初始化。
关于
sys.path.append_relative
的想法
虽然
sys.path.append_relative
看起来像一个好主意,但它在 Python 中并不存在。这是因为
sys.path
中的路径应该始终是绝对路径。使用相对路径可能会导致问题,尤其是在使用不同的工作目录运行脚本时。
建议
对于你的情况,我建议使用
相对导入
(如果你打算将
project
构建为一个包)或者
PYTHONPATH
环境变量
。这两种方法都是简单、直接且易于维护的。