"pwd" 当 运行 通过 python 子进程时在 windows 机器上给出路径

"pwd" giving path on windows machine when run through python subprocess

我写了下面的脚本 file_I_executed.py:

import subprocess
def main():
    loc = subprocess.popen("pwd")
    print loc

给出了输出:

C:\Python27\python.exe C:/Users/username/PycharmProjects/projectname/file_I_executed.py

但是,当我在 windows cmd 上尝试 "pwd" 时,我得到:

C:\Users\username\somedirectory>pwd
'pwd' is not recognized as an internal or external command,
operable program or batch file.

什么给了? subprocess 究竟是如何工作的?为什么 "pwd" 给我 python 路径以及脚本的路径,当我从 windows 命令行 运行 显然不应该给我时?

我在 windows 7.

上使用 pycharm 的 python 2.7.1

澄清: 我完全知道 "pwd" 不是 windows 命令。但是,上面显示的脚本给了我指示的结果,我不明白为什么。

pwd 是 linux 命令,而不是 Windows 命令。在 Windows 中你可以使用 echo %cd%.

当您 运行 PyCharm 下的程序时看到的输出不是来自 subprocess.popen("pwd") 调用。事实上,这个调用根本没有被执行!

您有一个 main 函数,但您没有任何 调用 main().

的代码

输出只是 PyCharm 启动程序时的默认打印输出。您将使用空程序获得相同的输出。如果您从命令行 运行 您的程序将没有输出。

如果你在文件底部添加一个main()调用,当它试图执行subprocess.popen("pwd")时你会得到一个错误,因为没有这样的函数。

如果您将其更改为正确的 subprocess.Popen("pwd"),您将收到没有 pwd 命令的预期错误。 (感谢 anarchos78 指出这一点。)

PyCharm 有一个集成调试器,可以帮助解决此类问题。通过单步执行代码,您可以轻松查看代码的哪些部分被执行或未执行。

发件人:https://docs.python.org/3/library/subprocess.html#module-subprocess

To support a wide variety of use cases, the Popen constructor (and the convenience functions) accept a large number of optional arguments. For most typical use cases, many of these arguments can be safely left at their default values. The arguments that are most commonly needed are:

args is required for all calls and should be a string, or a sequence of program arguments. Providing a sequence of arguments is generally preferred, as it allows the module to take care of any required escaping and quoting of arguments (e.g. to permit spaces in file names). If passing a single string, either shell must be True (see below) or else the string must simply name the program to be executed without specifying any arguments.

然而,这很奇怪,因为 Popen 调用实际上应该是大写的,就像最近的评论所说的那样。