【问题标题】:PATH not a recognised environ variable but clearly existsPATH 不是公认的环境变量,但显然存在
【发布时间】:2016-02-18 23:21:15
【问题描述】:

如何解释这种行为?

import os
print os.environ.keys()

在其键中列出了PATH,但是:

import os
print os.environ["PATH"]

给出错误:

NameError: name 'PATH' is not defined

此外,上面的代码一旦在 python 环境中编写就可以正常工作。

正如所见,我已经为用户和系统定义了一个 PATH 环境变量(通过控制面板)。

操作系统是 Windows Server 2008

【问题讨论】:

    标签: python windows operating-system anaconda


    【解决方案1】:

    您遇到的问题是您在已经被“import ...”包围的行中打印["PATH"]

    这不是 Python 问题,而是 shell 问题(在本例中,是来自 windows 的 CMD.exe)。 "import 双引号开始一个字符串。字符串继续,直到它看到一个双引号 - 就在 PATH 之前。所以你结束了

      quoted string: import os; print os.environ[
    unquoted string: PATH
      quoted string: ]
    

    所有这些都被粘在一起生产:

    import os; print os.environ[PATH]      
    

    注意,PATH 周围没有引号? Python 看到了这一点,并寻找一个未定义的符号 PATH。所以它会打印一个错误。

    正如@Tomasz Kajtoch 指出的那样,您可以通过“转义”您使用的引号或切换引号的风格来解决这个问题:

    python -c "import os; print os.environ[\"PATH\"]"
    

    python -c "import os; print os.eniron['PATH']"
    

    【讨论】:

    • 实际上在 Windows 上这是由于 C 运行时,而不是 shell。双引号会影响 cmd 如何为运算符解析字符串,但最终命令行会完全按照其写入内容传递给 python.exe,包括双引号。然后由 C 运行时将其解析为 argv 数组以传递给 main 函数。请注意,您正在使用反斜杠进行转义,这是 CRT 使用的转义字符。 cmd 的转义字符是抑扬符(“^”)。
    • 我认为插入符号作为引用仅适用于像 | 这样的元字符。和&?
    • 它是 cmd 使用的唯一转义字符。例如,试试这个python -c "import os; print os.environ[\"&PATH\"]"。就 cmd.exe 而言,“&”字符在引号字符串之外,因为它不理解反斜杠转义了双引号。所以“&”被解析为操作符,PATH\"]"被解析为第二条命令,也就是内置的path命令,所以现在将当前的%PATH%设置为\"]"
    • 谢谢,这与重新启动命令提示符以重新加载环境变量一起导致问题得到解决。
    • @jka.ne,请注意,此答案中的转义选项是一场等待发生的灾难。在shell cmd.exe 中,反斜杠不会转义双引号,因此两个\" 序列之间的特殊shell 字符(例如&、、|)将被cmd.exe 解析为运算符。它适用于这种情况,因为与 shell 无关的 CRT 在子进程中 需要反斜杠转义。
    【解决方案2】:

    这是因为你在引号内使用了引号。

    您可以将其转义或替换为分号。

    $ python -c "import os; print os.environ['PATH']"
    /Library/Frameworks/Python.framework/Versions/3.5/bin:/Users/[...]
    

    【讨论】:

      【解决方案3】:

      我认为您正在尝试将 Path 作为列表元素传递给 environ。但是由于 environ 是类,正如您在 print os.environ.keys() 中所做的那样,它具有成员函数而不是列表。 希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-30
        • 1970-01-01
        • 2019-05-15
        • 2012-12-03
        • 2019-04-12
        • 2012-09-05
        • 2016-04-08
        • 1970-01-01
        相关资源
        最近更新 更多