【问题标题】:Why sys.path doesn't contain cwd()?为什么 sys.path 不包含 cwd()?
【发布时间】:2014-08-01 17:09:35
【问题描述】:

我在 Linux 操作系统下使用带有 emacs(编辑器和 shell)的 python3。为什么 cwd 不在 sys.path 中?我们怎么说呢,对于所有会话! 我谢谢你。

【问题讨论】:

    标签: python linux shell emacs


    【解决方案1】:

    您确实想将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__ 模块执行。

    还有sys.path documentation

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

    您始终可以将当前工作目录显式添加到sys.path

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

    请注意,该工作目录中名称与您已在代码中使用的模块匹配的任何 python 文件或包都会屏蔽该模块,很容易导致损坏。

    【讨论】:

    • 我的问题只存在于 emacs。使用 emacs sys.path[0]='/usr/share/emacs/23.3/etc'。来自文件导入 * 的命令不起作用。 Python 看不到模块。当我使用终端 sys.path[0]='' 或 IDLE sys.path[0]='/home/me' 和我的 cwd 中的模块时
    • 啊,这很可能是只是 Emacs 的问题,而不是一般的 Python。
    【解决方案2】:

    【讨论】:

    • 这不会让您选择将 当前工作目录 添加到 sys.path,因为这取决于当前的 shell 会话。
    • 这就是你如何改变 sys.path 的评估结果,以防他们仍然想将 cwd 添加到它。
    • 但是当前工作目录是动态的;只需一个cd 调用即可使PYTHONPATH 失效,因为它将不再包含当前工作目录
    • 我知道它是动态的,我不知道他们会怎么做。我只是告诉他们如何永久更改它,但是他们想要去做。
    • 永久设置PYTHONPATH 几乎总是一个坏主意,正如 Martijn 所引用的那样。 Python 提供了其他更好的选择,例如修改sys.path、使用.pth 文件、virtualenvs,或者只是安装一些东西。最好先找出 OP 真正想要做什么。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2015-04-25
      • 2014-04-29
      • 2014-07-15
      • 1970-01-01
      • 2014-04-21
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多