为什么sys.path不包含cwd()?

时间:2014-08-01 17:09:36

标签: python linux shell emacs

我在Linux OS下使用python3和emacs(编辑器和shell)。为什么cwd不在sys.path中?我们怎么能把它,所有会议! 我谢谢你。

3 个答案:

答案 0 :(得分:5)

希望将cwd()添加到sys.path始终添加cwd()将是糟糕的主意,因为您无法再控制哪些文件可供导入。

Python会添加正在执行的脚本的目录

E.g。当你跑:

python.exe path/to/script.py

然后path/to会自动添加到sys.path

仅当您从当前目录运行脚本时,''才会添加到路径的开头,这意味着将搜索当前工作目录的导入。例如。当你运行python.exe localfile.py时,Python会添加当前的工作目录,假设您在导入时不会更改当前的工作目录。

请参阅命令行和环境文档中的Interface options

  

如果脚本名称直接引用Python文件,则包含该文件的目录将添加到sys.path的开头,并且该文件将作为__main__模块执行。

sys.path documentation

  

在程序启动时初始化时,此列表的第一项path[0]是包含用于调用Python解释器的脚本的目录。如果脚本目录不可用(例如,如果以交互方式调用解释器或者从标准输入读取脚本),path[0]是空字符串,它指示Python首先搜索当前目录中的模块。请注意,在PYTHONPATH

的结果插入条目之前插入了脚本目录

您始终可以明确地将当前工作目录添加到sys.path

import sys

if sys.path[0] != '':
    sys.path.insert(0, '')

请注意,该工作目录中的任何python文件或包的名称与您在代码中已使用的模块相匹配,将掩盖该模块,很容易导致破坏。

答案 1 :(得分:1)

答案 2 :(得分:0)

您可以更改PYTHONPATH环境变量。 这会将位置添加到默认模块搜索路径。 docs表示,从命令行运行脚本时, sys.path中的第一项将是脚本的路径。 文档说sys.path是 “从环境变量PYTHONPATH初始化,再加上与安装有关的默认值。” 例如,如果PYTHONPATH为空(PowerShell:$env:PYTHONPATH = ""), 仅添加依赖于安装的默认值。 但是,如果PYTHONPATH以空字符串开头, 然后将当前工作目录(运行脚本的目录)添加到PYTHONPATH。 (即使只是一个初始分隔符也会添加该分隔符,例如PowerShell中的分号:$env:PYTHONPATH = ";"。) 这并非总是所需的行为, 因此您不妨在对PYTHONPATH进行永久更改之前犹豫。