将目录永久添加到PYTHONPATH?


324

每当我使用时sys.path.append,都会添加新目录。但是,一旦我关闭python,列表将恢复为以前的值(默认值)。如何将目录永久添加到PYTHONPATH

Answers:


135

您需要将新目录添加到环境变量中PYTHONPATH,并用冒号与其之前的内容分隔开。在任何形式的Unix中,您都可以在启动脚本中执行此操作,该脚本适合于您正在使用的任何shell(.profile或取决于您喜欢的shell),该命令又取决于所讨论的shell。在Windows中,您可以为此目的通过系统GUI进行操作。

superuser.com 可能是一个更好的地方,例如,如果您需要有关如何在所选平台和外壳程序中丰富环境变量的详细信息,请提供更多详细信息,因为这本身并不是真正的编程问题。


8
勘误表:Windows上的分隔符为分号。如果需要覆盖Windows上的系统路径,通过GUI将其设置为用户环境变量可能是不够的,因为用户变量会附加到系统变量中。在这些情况下,您将需要使用启动脚本进行必要的调整。
内森·恩斯特

1
@Nathan,TX对分号的提醒,但(如果你是当然的管理员),你可以设置系统在Windows env.vars(另外,OP不问如何覆盖的道路,只是如何将追加到它,因此,用户env.var也可以做到这一点!-)。
亚历克斯·马蒂利

不幸的是,我不是我的工作PC的管理员,因此我不得不采取此类措施。:(
内森·恩斯特

438

如果您正在使用bash(在Mac或GNU / Linux发行版上),请将其添加到您的 ~/.bashrc

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

28
这完全为我工作,但要确保你指向具有在最上面的目录初始化 .py文件中的目录结构。起初这对我来说还不是很清楚。例如,我尝试导出PYTHONPATH = $ PYTHONPATH:/ Users / joey / repos,但是它没有用,因为我的repos目录没有_ init_ .py。再往下一个目录:/ Users / joey / repos / specificRepo可以解决问题。现在,python可以遍历连接到包含init .py 的specificRepo目录的任何向下目录!
乔逸

3
这对我有用,但是您能解释一下该PYTHONPATH变量位于何处吗?以及“导出PYTHONPATH”如何知道该确切文件的位置?
appleLover

42
之后你还记得编辑~/.bashrc然后运行source ~/.bashrcstackoverflow.com/questions/2518127/...
b_dev

1
我认为放在sudo su.bashrc文件的开头是个坏主意。这篇文章与我同意。至少在我的系统上,这甚至没有必要。
LondonRob 2014年

这就是答案。
Aerin

88

除了操作之外,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"

我已经使用Python 2.6进行了尝试,但它似乎对我不起作用
Lorcan O'Neill 2013年

4
我只是将此目录符号链接到我自己的库目录,并将所有脚本存储在那里。工作正常。
firesofmay

解决了再次找到该主题后再试一次的问题,这次设法使它像上面一样工作!被指责和悔恨的道歉:)
Lorcan O'Neill

这工作得非常好,我走在正确的轨道上,但是缺少python -m site --user-site(create the directory if it doesn't exist)部分来使它正常工作。
的Aurelien奥姆斯

1
我是否需要采取其他步骤,以便python识别出添加到的路径somelib.pth?如果没有,有任何猜测为什么这可能行不通?
Miladiouss

38

这适用于Windows

  1. 在Windows上,对于Python 2.7,请转到Python设置文件夹。
  2. 打开库/站点包。
  3. 将example.pth空文件添加到此文件夹。
  4. 将所需的路径添加到文件,每行一个。

然后,您将能够从脚本中查看这些路径内的所有模块。


3
IMO,这是最好的解决方案,因为它不依赖于外壳或工作环境的选择。同样适用于linux,默认的python路径是“ /usr/local/lib/pythonX.Y/site-packages”。如果这样不起作用,请尝试将.pth文件放到dist-packages目录中。
matus 2016年

1
Windows 7,Python 3.6.5。这就是答案。正如auserdude所说的那样:在Python的Lib / site-packages文件夹中创建“ example.pth”,然后像这样添加路径:C:\ somefolder \ anotherfolder \ targetfolder
JayJay123 '18

很好的答案,也可以在Windows 10上使用python 3.7,我的Windows 10路径是:“ C:\ Users \ {usrName} \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib”
Ali80 '18

可以确认它适用于Windows 10上的Python 3.6.7。但是,请注意,该路径将附加到PYTHONPATH中,这意味着在名称冲突的情况下将找不到附加的模块。
BramAppel

24

如果仍然有人困惑-如果您使用的是Mac,请执行以下操作:

  1. 打开终端
  2. 类型 open .bash_profile
  3. 在弹出的文本文件中,在最后添加以下行: export PYTHONPATH=$PYTHONPATH:foo/bar
  4. 保存文件,重新启动终端,然后完成

1
任何想知道如何查看python路径的人,请使用:哪个python
Arindam Roychowdhury

非常确定您也需要重新加载终端
用户

实际上,export关键是我所缺少的东西!!!!
a_m_dev

21

您可以通过pythonrc文件添加路径,该文件在Linux上默认为〜/ .pythonrc。即。

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

您也可以PYTHONPATH在全局rc文件中(例如~/.profile在Mac或Linux上)或通过Windows上的“控制面板”->“系统”->“高级”选项卡->“环境变量”来设置环境变量。


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

15

为了提供更多说明,Python将使用脚本(通常位于sys.prefix + 和中)自动构建其搜索路径(如上所述此处)。一个可以获得sys.prefix的值:site.pylib/python<version>/site-packageslib/site-python

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为'framework builds'添加了一个特殊的附加搜索路径(但似乎适用于python的常规命令行使用):(/Library/Python/<version>/site-packages例如,对于Python2.7:)/Library/Python/2.7/site-packages/,这是应该使用第三方软件包的地方要安装(请参阅该目录中的自述文件)。因此,可以在其中添加包含其他搜索路径的路径配置文件,例如创建一个名为的文件/Library/Python/2.7/site-packages/pip-usr-local.pth,其中包含/usr/local/lib/python2.7/site-packages/,然后系统python将添加该搜索路径。


10

对我来说,当我更改.bash_profile文件时它起作用了。只是更改.bashrc文件才有效,直到我重新启动外壳程序为止。

对于python 2.7,它应如下所示:

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

.bash_profile文件末尾。


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

1
@jxramos-是的!
彼得·派珀(Piper Piper)'18

9

在Linux上,您可以创建从软件包到PYTHONPATH目录的符号链接,而不必处理环境变量。就像是:

ln -s /your/path /usr/lib/pymodules/python2.7/

7

export PYTHONPATH="${PYTHONPATH}:/my/other/path"如果PYTHONPATH当前不存在,则添加到〜/ .bashrc可能不起作用(因为:)。

export PYTHONPATH="/my/other/path1"
export PYTHONPATH="${PYTHONPATH}:/my/other/path2"

将以上内容添加到我的〜/ .bashrc中可以在Ubuntu 16.04上为我实现窍门


我照做了echo PYTHONPATH,什么都没出现!这意味着此PYTHONPATH尚未启动,因此我仅将此行粘贴export PYTHONPATH=$PYTHONPATH:<PATH_TO_TF>/TensorFlow/models/research/object_detection到我的~/.bashrc文件中即可source ~/.bashrc 。后来,当我执行echo $ PYTHONPATH时,它给了我:<PATH_TO_TF>/TensorFlow/models/research/object_detection,如果我做错了什么建议?
阿努

export PYTHONPATH=<PATH_TO_TF>/TensorFlow/models/research/object_detection,当您首次导出PYTHONPATH时,您必须没有该${PYTHONPATH}:部分而做
boyangeor '19

谢谢,但是每当我重新启动计算机时,python路径都将重置为我设置的第一个即:<PATH_TO_TF>/TensorFlow/models/research/object_detection第二个export PYTHONPATH=$PYTHONPATH:/TensorFlow/models/research/slim。有什么建议,如何解决?
阿努

7

在MacOS上,而不是提供到特定库的路径。提供到根项目文件夹的完整路径

~/.bash_profile 

让我过得愉快,例如:

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

在此之后:

source ~/.bash_profile

6

只是对awesomo的答案添加,也可以添加该行到您~/.bash_profile~/.profile


.bash_profile如果使用登录外壳,则添加到该文件,否则使用.profile
smac89 '16

3

通过以下方式手动添加到PYTHONPATH的新路径:

在终端中通过以下方式将路径添加到〜/ .bashrc配置文件中:

vim ~/.bashrc

将以下内容粘贴到您的个人资料中

export PYTHONPATH="${PYTHONPATH}:/User/johndoe/pythonModule"

然后,确保在终端中运行代码时都获取bashrc配置文件的来源:

source ~/.bashrc 

希望这可以帮助。


2

我在Windows Vista中永久添加了Python 3.5

系统>控制面板>高级系统设置>高级(点击)环境变量>系统变量>(如果在“变量”列中没有看到PYTHONPATH)(单击)新建>变量名称:PYTHONPATH>变量值:

请在变量值中写入目录。这是Blue Peppers答案的细节。


1

以下脚本是纯Python,因此可在所有平台上使用。它利用了https://docs.python.org/3/library/pathlib.html此处记录的pathlib路径,以使其跨平台工作。您只需运行一次,然后重新启动内核即可。受https://medium.com/@arnaud.bertrand/modifying-python-s-search-path-with-pth-files-2a41a4143574的启发。

from pathlib import Path
to_add=Path(path_of_directory_to_add)
from sys import path

if str(to_add) not in path:
    minLen=999999
    for index,directory in enumerate(path):
        if 'site-packages' in directory and len(directory)<=minLen:
            minLen=len(directory)
            stpi=index

    pathSitePckgs=Path(path[stpi])
    with open(str(pathSitePckgs/'current_machine_paths.pth'),'w') as pth_file:
        pth_file.write(str(to_add))

1

这是对此线程的更新,具有一些旧的答案。

对于使用MAC-OS Catalina或更高版本(> = 10.15)的用户,它引入了一个新的终端,名为zsh(替代旧的bash)。

由于此更改,上述答案有些问题,我通过创建文件~/.zshrc并将文件目录粘贴到$PATH和进行了一些变通方法$PYTHONPATH

所以,首先我做了:

nano ~/.zshrc

当编辑器打开时,我粘贴了以下内容:

export PATH="${PATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"
export PYTHONPATH="${PYTHONPATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"

保存它,然后重新启动终端。

重要提示:上面的路径设置为我计算机的路径,您必须将其调整为适合您的python。


0

在Python 3.6.4中,您可以像这样在python会话之间持久化sys.path:

import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print(f"current working dir: {dir_path}")

root_dir = dir_path.replace("/util", '', 1)
print(f"root dir: {root_dir}")

sys.path.insert(0, root_dir)

print(str(sys.path))

我强烈建议您使用virtualenv和virtualenvwrapper,否则您的路径将会混乱


-3

A <-> B之间的最短路径是一条直线;

import sys
if not 'NEW_PATH' in sys.path:
  sys.path += ['NEW_PATH']
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.