【发布时间】:2014-08-01 17:09:35
【问题描述】:
我在 Linux 操作系统下使用带有 emacs(编辑器和 shell)的 python3。为什么 cwd 不在 sys.path 中?我们怎么说呢,对于所有会话! 我谢谢你。
【问题讨论】:
我在 Linux 操作系统下使用带有 emacs(编辑器和 shell)的 python3。为什么 cwd 不在 sys.path 中?我们怎么说呢,对于所有会话! 我谢谢你。
【问题讨论】:
您确实不想将cwd() 添加到sys.path。 总是添加cwd() 将是一个可怕的想法,因为您无法再控制哪些文件可用于导入。
Python 添加了正在执行的脚本的目录。
例如当你运行时:
python.exe path/to/script.py
然后path/to 会自动添加到sys.path。
仅当您从当前目录运行脚本时,才会将'' 添加到路径的开头,这意味着会在当前工作目录中搜索导入。例如。当您运行python.exe localfile.py 时,Python 会添加当前工作目录,假设您在导入时不会更改当前工作目录。
请参阅命令行和环境文档中的Interface options:
如果脚本名称直接引用 Python 文件,则将包含该文件的目录添加到
sys.path的开头,并将文件作为__main__模块执行。
在程序启动时初始化,此列表的第一项
path[0]是包含用于调用 Python 解释器的脚本的目录。如果脚本目录不可用(例如,如果以交互方式调用解释器或从标准输入读取脚本),path[0]是空字符串,它指示 Python 首先搜索当前目录中的模块。请注意,脚本目录是在作为PYTHONPATH的结果插入的条目之前插入的。
您始终可以将当前工作目录显式添加到sys.path:
import sys
if sys.path[0] != '':
sys.path.insert(0, '')
请注意,该工作目录中名称与您已在代码中使用的模块匹配的任何 python 文件或包都会屏蔽该模块,很容易导致损坏。
【讨论】:
【讨论】:
sys.path,因为这取决于当前的 shell 会话。
sys.path 的评估结果,以防他们仍然想将 cwd 添加到它。
cd 调用即可使PYTHONPATH 失效,因为它将不再包含当前工作目录。
PYTHONPATH 几乎总是一个坏主意,正如 Martijn 所引用的那样。 Python 提供了其他更好的选择,例如修改sys.path、使用.pth 文件、virtualenvs,或者只是安装一些东西。最好先找出 OP 真正想要做什么。
您可以更改 PYTHONPATH 环境变量。
这会将位置添加到默认模块搜索路径。
docs 说,从命令行运行脚本时,
sys.path 中的第一项将是脚本的路径。
文档说 sys.path 然后
“从环境变量 PYTHONPATH 初始化,加上依赖于安装的默认值。”
例如,如果PYTHONPATH 为空(PowerShell:$env:PYTHONPATH = ""),
仅添加依赖于安装的默认值。
但是,如果PYTHONPATH 以空字符串开头,
然后将当前工作目录(运行脚本的目录)添加到PYTHONPATH。
(即使只是一个初始分隔符也会添加这个——例如 PowerShell 中的分号:$env:PYTHONPATH = ";"。)
这并不总是理想的行为,
因此,您可能希望在对您的PYTHONPATH 进行永久性更改之前犹豫一下。
【讨论】: