如何将一个目录永久添加到PYTHONPATH中?

458
每当我使用sys.path.append时,新目录都会被添加。然而,一旦我关闭python,列表将恢复到以前(默认?)的值。如何永久地将一个目录添加到PYTHONPATH中?
24个回答

594

如果你正在使用bash(在Mac或GNU/Linux发行版上),请将以下内容添加到您的~/.bashrc文件中:

export PYTHONPATH="${PYTHONPATH}:/my/other/path"

41
这对我来说完美地解决了问题,但请确保你所指向的目录在目录结构的最顶层有一个 init.py 文件。一开始对我来说这不够清晰明了。例如,我尝试过 export PYTHONPATH=$PYTHONPATH:/Users/joey/repos ,但它没有起作用,因为我的 repos 目录中没有 _init_.py。进一步往下一级目录:**/Users/joey/repos/specificRepo** 就奏效了。现在 Python 可以遍历与包含 init.py 的 specificRepo 目录相连通的任何下层目录! - Joey
5
这对我有用,但您能否解释一下 PYTHONPATH 变量的位置在哪里?以及 "export PYTHONPATH" 如何知道要定位到那个确切的文件? - appleLover
55
编辑完~/.bashrc文件后,记得运行source ~/.bashrc命令以使修改生效。详情请参考https://dev59.com/tnE85IYBdhLWcg3w_Itr。 - b_dev
2
我认为在你的.bashrc文件开头放置sudo su是一个不好的主意。这篇文章也同意我的看法。至少在我的系统上,这甚至都不是必要的。 - LondonRob
2
为什么这让我觉得Python部署到生产环境可能会很麻烦。 - Paul Carlton
显示剩余5条评论

158
您需要将新目录添加到环境变量PYTHONPATH中,与先前的内容以冒号分隔。在任何形式的Unix中,您可以通过启动脚本完成此操作,该脚本适用于您正在使用的任何shell(例如.profile等,具体取决于您喜欢的shell),命令取决于所涉及的shell。在Windows中,您可以通过系统GUI来完成此操作。
如果您需要关于如何在所选平台和shell中丰富环境变量的具体细节,请访问superuser.com获取更多信息,因为这不是一个真正的编程问题。

9
勘误:在Windows系统中,分隔符应该使用分号。如果您需要覆盖Windows系统路径,通过GUI设置用户环境变量可能不足够,因为用户变量会附加到系统变量上。在这些情况下,您需要使用启动脚本进行必要的调整。 - Nathan Ernst
1
@Nathan,感谢您提醒分号的问题,但(如果您是管理员)您确实可以在Windows上设置系统环境变量(另外,OP并没有询问如何覆盖路径,只是想追加到路径中,因此用户环境变量也可以胜任!-)。 - Alex Martelli
1
不幸的是,我在我的工作电脑上不是管理员,所以我不得不采取这样的措施。 :( - Nathan Ernst
在Windows中,你可以通过系统GUI来实现这个目的。但是这对我并没有起作用。我不得不实施Andrei Deusteanu下面的解决方案。 - juggler

113

除了操作 PYTHONPATH,您还可以创建一个路径配置文件。首先找出 Python 搜索此信息的目录:

python -m site --user-site

由于某些原因,这在Python 2.7中似乎不起作用。您可以使用以下代码:

python -c 'import site; site._script()' --user-site

然后在该目录中创建一个.pth文件,其中包含您想要添加的路径(如果不存在,请创建该目录)。

例如:

# find directory
SITEDIR=$(python -m site --user-site)

# create if it doesn't exist
mkdir -p "$SITEDIR"

# create new .pth file with our path
echo "$HOME/foo/bar" > "$SITEDIR/somelib.pth"

4
我将此目录与我的个人库目录建立了符号链接,并将所有的脚本存储在那里。运行良好。 - firesofmay
这个完美地运行了,我一开始就走对了方向,但是 python -m site --user-site(如果不存在则创建目录) 部分是我缺失的,让它能够正常工作。 - Mmmh mmh
如果使用virtualenv,SITEDIR(如上所述)文件夹是否应更改? 对我来说,它没有更改,但是不知道是否因为我的主Python安装在PATH中还是因为virtualenv中的Python仍然将相同的文件夹用作SITEDIR。 - Gabriel
我已经这样做了,但出于某种原因,我使用的IDE(eclipse)无法找到我从刚刚创建.pth文件的文件夹中导入的内容。 我重新启动了eclipse,但没有效果。 - patapouf_ai
1
我需要采取额外的步骤,以便Python能够识别添加到somelib.pth的路径吗?如果不需要,你有什么猜测为什么这可能无法正常工作? - Miladiouss
显示剩余5条评论

61

这适用于Windows操作系统

  1. 在Windows操作系统中,使用Python 2.7版本,请前往Python安装目录下的安装文件夹。
  2. 打开Lib/site-packages文件夹。
  3. 在该文件夹下添加一个名为example.pth的空文件。
  4. 将所需路径添加到该文件中,每行一个路径。

然后您就可以从脚本中访问这些路径下的所有模块了。


3
据我看来,这是最佳解决方案,因为它不依赖于外壳或工作环境的选择。它也可以在Linux上运行,其中默认的Python路径为“/usr/local/lib/pythonX.Y/site-packages”。如果这样做无效,请尝试将您的.pth文件放到dist-packages目录中。 - matus
2
Windows 7,Python 3.6.5。这就是答案。正如用户dude所写:在Python的Lib/site-packages文件夹中创建“example.pth”,然后像这样添加您的路径:C:\somefolder\anotherfolder\targetfolder。 - JayJay123
2
优秀的答案,也适用于在Windows 10上使用Python 3.7, 我的Windows 10路径是: "C:\ Users \ {usrName} \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib" - Ali80
1
可以确认在Windows 10上Python 3.6.7可行。但是请注意,路径被附加到PYTHONPATH中,这意味着在名称冲突的情况下,您的附加模块将无法被找到。 - BramAppel
看起来这基本上等同于Andrei Deusteanu的回答。您需要管理员权限才能保存到那个文件夹。我正在使用Blender 2.8,Windows 10。 - juggler

32

如果有人还感到困惑,如果您使用的是Mac,请按照以下步骤操作:

  1. 打开终端
  2. 输入 open .bash_profile
  3. 在弹出的文本文件中,在末尾添加此行:export PYTHONPATH=$PYTHONPATH:foo/bar
  4. 保存文件,重新启动终端,完成

3
想知道如何查看 Python 路径,使用命令:which python - Arindam Roychowdhury
很确定你也需要重新加载终端。 - User
实际上,我缺少的是export关键字!!!已点赞,非常感谢! - amdev

28

你可以通过编辑pythonrc文件来添加路径,该文件在Linux上默认为~/.pythonrc。例如:

import sys
sys.path.append('/path/to/dir')

你也可以设置PYTHONPATH环境变量,可以在全局RC文件中设置,例如mac或linux下的~/.profile,或者通过控制面板 ->系统->高级选项卡->环境变量来设置Windows。


52
sys.path.append('/path/to/dir')并不会永久添加该条目。 - jeremyjjbrown

18
为了更好地解释,Python会自动使用site.py脚本(通常位于sys.prefix + lib/python<version>/site-packages以及lib/site-python,如上所述abovehere)构建其搜索路径。可以获取sys.prefix的值:
python -c 'import sys; print(sys.prefix)'

site.py脚本会添加一些目录到搜索路径中,这些目录依赖于平台,例如/usr/{lib,share}/python<version>/dist-packages/usr/local/lib/python<version>/dist-packages等。同时,它还会在这些路径中搜索包含特定附加搜索路径的<package>.pth配置文件。例如,easy-install维护了其安装包的集合,这些包被添加到系统特定的文件中,例如在Ubuntu上,它是/usr/local/lib/python2.7/dist-packages/easy-install.pth。在典型的系统中,有很多这样的.pth文件,这可以解释sys.path中一些意外的路径。

python -c 'import sys; print(sys.path)'

因此,可以创建一个.pth文件并将其放在这些目录中的任何一个(包括上面提到的 sitedir)中。这似乎是大多数软件包被添加到sys.path的方式,而不是使用PYTHONPATH。

注意:在OSX上,site.py会为“框架构建”添加特殊的附加搜索路径(但似乎适用于正常的python命令行使用):/Library/Python/<version>/site-packages(例如,对于Python2.7:/Library/Python/2.7/site-packages/),其中第三方软件包应该被安装(请参见该目录中的README)。因此,可以在其中添加一个路径配置文件,其中包含其他搜索路径,例如创建一个名为/Library/Python/2.7/site-packages/pip-usr-local.pth的文件,其中包含/usr/local/lib/python2.7/site-packages/,然后系统python将添加该搜索路径。


15
在MacOS上,不需要给出特定库的路径,可以直接给出根项目文件夹的完整路径。
~/.bash_profile 

让我开心了,例如:

export PYTHONPATH="${PYTHONPATH}:/Users/<myuser>/project_root_folder_path"

执行以下操作:

source ~/.bash_profile

11

当我更改.bash_profile文件时,它对我起作用了。仅更改.bashrc文件只有在重新启动Shell之前才能工作。

对于Python 2.7,它应该看起来像:

export PYTHONPATH="$PYTHONPATH:/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python"

.bash_profile文件的末尾。


1
如果我理解正确,这将仅导出通过终端启动的Python会话的变量,对吗? - jxramos
1
@jxramos - 是的! - Bergrebell

11
在Linux上,你可以创建一个符号链接将你的包连接到PYTHONPATH的目录中,而无需处理环境变量。例如:
ln -s /your/path /usr/lib/pymodules/python2.7/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接