from subprocess import *
test = subprocess.Popen('ls')
print test
当我尝试运行这个简单的代码时,我得到一个错误窗口:
WindowsError: [Error 2] The system cannot find the file specified
我不知道为什么我不能让这个简单的代码工作而且令人沮丧,任何帮助都将不胜感激!
答案 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
备注:强>
shell=True
因为存在安全风险
有关详细信息,请参阅Why not just use shell=True
in subprocess.Popen in Python? from module import *
。在Language Constructs You Should Not Use中查看原因
当您使用subprocess.Popen()
时,它甚至不能用于此目的。 答案 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强制多列输出。