让Python使用我目录中的代码(而不是/usr/...中的)

2 投票
5 回答
784 浏览
提问于 2025-04-15 16:06

我正在尝试使用一个已经安装在我(Ubuntu)系统上的Python库。我查看了这个库,编辑了一些文件,并写了一个小脚本来测试我的修改。尽管我把我的脚本放在和这个库相同的文件夹里,但似乎Python还是在使用安装的版本(也就是在/usr/share/pyshared/...里的那个)。

这是我的目录结构:

src
+ my_package
    - my_script.py
+ library_package
    - lots_of_code

我该怎么告诉Python使用我目录里的代码,而不是安装的那个呢?

5 个回答

3
import sys
from os.path import join, dirname, pardir

sys.path.insert(0, join(dirname(__file__), pardir))

这段话的意思是,它会先在src这个文件夹里查找任何的Python模块。即使你在其他地方也安装了同名的模块,这样做会让Python优先加载本地的那个模块。

sys.path 文档

3

让我们考虑一个更普遍的问题。在/usr/share/pyshared/目录下,有很多模块。假设你想要覆盖其中的一个模块,名字叫xyz.py。这个模块还会用到/usr/shared/pyshared里的其他模块。

假设我们创建一个文件夹$HOME/mylibs,并把$HOME添加到Python的sys.path中。

现在,每当我们需要使用xyz时,我们可以这样做:

from mylibs import xyz

如果我们想要恢复使用原来的xyz模块,可以尝试:

import xyz # picks up from /usr/shared/pyshared 

我在想,这种方法是否更通用。你只需要覆盖那些你想要替换的模块,其他的模块照常使用。

3

你可以通过设置 PYTHONPATH 这个环境变量来告诉 python 在哪里寻找模块:

当你导入一个名为 spam 的模块时,解释器会先在当前目录中寻找一个叫 spam.py 的文件,然后再去 PYTHONPATH 环境变量中指定的目录列表里找。这个列表的格式和 shell 的 PATH 变量是一样的,也就是一系列的目录名称。如果 PYTHONPATH 没有设置,或者在这些地方找不到文件,解释器就会继续在一个默认的路径中查找,这个路径通常和你安装的系统有关;在 Unix 系统上,这个默认路径一般是 .:/usr/local/lib/python。

来源于 http://docs.python.org/tutorial/modules.html#the-module-search-path

撰写回答