0
from subprocess import *

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

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

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

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

4

2 回答 2

3

看起来您想存储subprocess.Popen()调用的输出。
有关详细信息,请参阅子流程 - 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)

有关更多信息,请参阅:
有用且简洁的子进程模块 - 在终端模拟器中启动命令 - Windows


笔记:

于 2013-05-14T13:50:50.440 回答
0

同意 timss;Windows 没有ls命令。如果您想要像lsWindows 上的目录列表,请使用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 强制多列输出。

于 2013-05-14T14:52:51.683 回答