将目录添加到sys.path / PYTHONPATH

181

我试图从特定目录导入一个模块。

问题在于,如果我使用 sys.path.append(mod_directory) 添加路径,然后打开Python解释器,目录mod_directory会被添加到sys.path的末尾。如果我在打开Python解释器之前导出PYTHONPATH变量,则该目录将添加到列表的开头。在后一种情况下,我可以导入模块,但是在前一种情况下,我不能。

有人能解释为什么会发生这种情况,并给我提供在Python脚本内将mod_directory添加到开头的解决方案吗?


1
我已经尝试过site模块 - Zeinab Abbasimazar
5个回答

278

这正如文档所述。在PYTHONPATH中指定的路径通常在工作目录之后但在标准解释器提供的路径之前。sys.path.append()将路径添加到现有路径中。请参见这里这里。如果您想让特定的目录首先出现,请将其插入到sys.path的开头:

import sys
sys.path.insert(0,'/path/to/mod_directory')

话虽如此,通常有比使用PYTHONPATH或直接操纵sys.path更好的管理导入的方法。例如,请参见此问题的答案


1
谢谢回复。问题在于我没有意识到,在Python 2.6中添加打包为.egg文件的模块时,必须包括文件名而不仅仅是目录。 - UnadulteratedImagination
2
嘿,伙计,这个东西弄崩了我的Django。你确定要告诉人们把它放在顶部吗?!?! - R Claven
23
抱歉,很难理解你所提到的行动和结果:"把它放在顶部"和"破坏了我的Django"并不十分明确。能否详细说明一下? - Ned Deily
2
只是一个小提示:sys.path 和任何列表一样都是从零开始索引的,因此应该是 sys.path.insert(0, '/path/to/mod_directory') - HiFile.app - best file manager
6
你应该使用“1”而不是“0”!否则会破坏 sys.path。另请参见https://dev59.com/Kmkw5IYBdhLWcg3wKXX_。 - kadee
显示剩余3条评论

18

你可以使用:

import os
path = 'the path you want'
os.environ['PATH'] += ':'+path

4
在Windows中需要使用分号';'。 - sanjivgupta

12

对于我来说,我需要将Caffe添加到我的Python路径上。我可以通过在/home/xy/.bashrc文件中添加

export PYTHONPATH=/home/xy/caffe-master/python:$PYTHONPATH

来实现它的路径。

但是当我使用PyCharm时,路径仍然不存在。

因此,我可以通过运行->编辑配置,将路径添加到PYTHONPATH变量中。

输入图像描述


最简单的方法是最好的答案,添加这个开发工具将使自动完成功能正常工作。 - Gang
我按照上述说明更新了 .bashrc,但是在 jupyter notebook 中没有反映出来。Jupyter notebook 仍然显示找不到模块。 - Athar

2
在Windows下使用PowerShell运行Python脚本时,应该按照以下步骤操作:
$pathToSourceRoot = "C:/Users/Steve/YourCode"
$env:PYTHONPATH = "$($pathToSourceRoot);$($pathToSourceRoot)/subdirs_if_required"

# Now run the actual script
python your_script.py

1

暂时改变目录对于导入很有效:

cwd = os.getcwd()
os.chdir(<module_path>)
import <module>
os.chdir(cwd)

这似乎不起作用,在Python 3.8.11上出现了问题,提示“没有名为'<module>'的模块”。 - ssc

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