将目录添加到 sys.path /PYTHONPATH

Posted

技术标签:

【中文标题】将目录添加到 sys.path /PYTHONPATH【英文标题】:adding directory to sys.path /PYTHONPATH 【发布时间】:2013-04-13 10:10:02 【问题描述】:

我正在尝试从特定目录导入模块。

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

有人可以解释为什么会发生这种情况并给我一个解决方案,将mod_directory 添加到开头, python 脚本中?

【问题讨论】:

我试过site module。 【参考方案1】:

这是按记录工作的。 PYTHONPATH 中指定的任何路径都记录为通常在工作目录之后但在标准解释器提供的路径之前。 sys.path.append() 附加到现有路径。请参阅 here 和 here。如果你想要一个特定的目录首先出现,只需将它插入到 sys.path 的头部即可:

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

也就是说,管理导入的方法通常比使用PYTHONPATH 或直接操作sys.path 更好。例如,请参阅this question 的答案。

【讨论】:

感谢您的回复。问题是我没有意识到要添加打包为 .egg 文件的模块,您必须包含文件名而不仅仅是 python 2.6 中的目录 嘿伙计,这打破了我的 django。你确定你的意思是告诉人们把它放在顶部?!?!!? @RClaven,对不起,很难说你指的是什么动作和结果:“把它放在顶部”和“打破我的 django”不是很精确。你能详细说明一下吗? 只是一个旁注:sys.path 是零索引的任何列表,所以它应该是 sys.path.insert(0, '/path/to/mod_directory') 你真的应该使用“1”而不是“0”!否则你会破坏sys.path。另见***.com/q/10095037/125507。【参考方案2】:

你可以使用:

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

【讨论】:

你需要';'在窗口中。【参考方案3】:

对我来说,我需要 caffe 到我的 python 路径。我可以将它的路径添加到文件中 /home/xy/.bashrc 添加

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

到我的/home/xy/.bashrc 文件。

但是我用pycharm的时候,路径还是不在里面。

所以我可以通过运行 -> 编辑配置来添加 PYTHONPATH 变量的路径。

【讨论】:

最简单的就是最好的答案,添加这个用于开发将使自动完成工作 我已经按照上面的解释更新了 .bashrc,但没有反映在 jupyter notebook 中。 Jupyter notebook 仍然显示找不到模块。【参考方案4】:

临时更改目录适用于导入:

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

【讨论】:

这似乎不起作用;在 Python 3.8.11 上使用 No module named '&lt;module&gt;' 失败。【参考方案5】:

在 Windows 下从 Powershell 运行 Python 脚本时,应该可以:

$pathToSourceRoot = "C:/Users/Steve/YourCode"
$env:PYTHONPATH = "$($pathToSourceRoot);$($pathToSourceRoot)/subdirs_if_required"

# Now run the actual script
python your_script.py

【讨论】:

以上是关于将目录添加到 sys.path /PYTHONPATH的主要内容,如果未能解决你的问题,请参考以下文章

python导包问题,这一篇就够了

Python:相对于当前运行脚本添加到 sys.path 的最佳方式

sys.path.insert

python 怎么引用其他文件的类

DAY16模块和包

如何刷新 sys.path?