为什么我的python子进程代码不起作用?

时间:2013-05-14 13:20:31

标签: python windows subprocess windowserror

from subprocess import *

test = subprocess.Popen('ls')
print test

当我尝试运行这个简单的代码时,我得到一个错误窗口:

WindowsError: [Error 2] The system cannot find the file specified

我不知道为什么我不能让这个简单的代码工作而且令人沮丧,任何帮助都将不胜感激!

2 个答案:

答案 0 :(得分:3)

您希望存储subprocess.Popen()来电的输出 有关详细信息,请参阅Subprocess - Popen.communicate(input=None)

>>> import subprocess
>>> test = subprocess.Popen('ls', stdout=subprocess.PIPE)
>>> out, err = test.communicate()
>>> print out
fizzbuzz.py
foo.py
[..]

但是,Windows shell(cmd.exe)没有ls命令,但还有另外两种选择:

使用os.listdir() - 这应该是优先方法,因为它更容易使用:

>>> import os
>>> os.listdir("C:\Python27")
['DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'python.exe
', 'pythonw.exe', 'README.txt', 'tcl', 'Tools', 'w9xpopen.exe']

使用Powershell - 默认安装在较新版本的Windows上(> = Windows 7):

>>> import subprocess
>>> test = subprocess.Popen(['powershell', '/C', 'ls'], stdout=subprocess.PIPE)
>>> out, err = test.communicate()
>>> print out


    Directory: C:\Python27


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        14.05.2013     16:00            DLLs
d----        14.05.2013     16:01            Doc
[..]

使用cmd.exe的Shell命令将是这样的:

test = subprocess.Popen(['cmd', '/C', 'ipconfig'], stdout=subprocess.PIPE)

有关详细信息,请参阅:
The ever useful and neat subprocess module - Launch commands in a terminal emulator - Windows


备注:

答案 1 :(得分:0)

同意timss; Windows没有ls命令。如果您想在Windows上使用ls这样的目录列表,请将dir /B用于单列,或dir /w /B用于多列。或者只使用os.listdir。如果您使用dir,则必须使用subprocess.Popen(['dir', '/b'], shell=True)启动子流程。如果要存储输出,请使用subprocess.Popen(['dir', '/b'], shell=True, stdout=subprocess.PIPE)。而且,我使用shell=True的原因是,因为dir是内部DOS命令,所以必须使用shell来调用它。 / b剥离标题,/ w强制多列输出。