我编写了以下名为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.
是什么给出的?子进程是如何工作的?为什么“pwd”给了我python路径以及脚本的路径,当我从windows命令行运行它时它显然不应该给我这个?
我在Windows 7上使用来自pycharm的python 2.7.1。
澄清:我完全清楚“pwd”不是Windows命令。但是,上面显示的脚本给了我指示的结果,我不明白为什么。
答案 0 :(得分:3)
在PyCharm下运行程序时看到的输出不是来自subprocess.popen("pwd")
调用。事实上,这个电话根本就没有被执行过!
您有一个main
功能,但您没有任何调用的代码 main()
。
输出只是PyCharm启动程序时的默认打印输出。您将使用空程序获得相同的输出。如果从命令行运行程序,则不会输出。
如果在文件底部添加main()
调用,则在尝试执行subprocess.popen("pwd")
时会出错,因为没有此类函数。
如果将其更改为正确的subprocess.Popen("pwd")
,您将收到没有pwd
命令的预期错误。 (感谢anarchos78指出这一点。)
PyCharm有一个集成的调试器,可以帮助解决这样的问题。通过单步执行代码,您可以轻松查看代码的哪些部分已执行。
答案 1 :(得分:2)
pwd
是一个linux命令,而不是Windows命令。在Windows中,您可以使用echo %cd%
。
答案 2 :(得分:1)
来自:https://docs.python.org/3/library/subprocess.html#module-subprocess
为了支持各种用例,Popen构造函数(和便捷函数)接受大量可选参数。对于大多数典型用例,其中许多参数可以安全地保留其默认值。最常需要的论点是:
所有调用都需要args,它应该是一个字符串或一系列程序参数。通常优选提供一系列自变量,因为它允许模块处理任何所需的转义和引用参数(例如,允许文件名中的空格)。如果传递单个字符串,则shell必须为True(参见下文),否则字符串必须简单地命名要执行的程序而不指定任何参数。
然而,这很奇怪,因为Popen电话实际上应该是大写,就像最近的评论所说的那样。