子进程调用ls时出错

时间:2014-08-02 02:08:52

标签: python windows subprocess ls dir

任何想法是什么意思?

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    subprocess.call(["ls", "-l"])
  File "D:\Python27\lib\subprocess.py", line 522, in call
    return Popen(*popenargs, **kwargs).wait()
  File "D:\Python27\lib\subprocess.py", line 710, in __init__
    errread, errwrite)
  File "D:\Python27\lib\subprocess.py", line 958, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

2 个答案:

答案 0 :(得分:3)

您正在Windows上调用ls命令,该命令没有ls。您可以从http://gnuwin32.sourceforge.net/packages/coreutils.htm获取ls的端口,并将其已安装的bin目录添加到您的窗口PATH(或在您的python脚本运行时将其添加到PATH) 。如果您不知道如何执行此操作,请分别查看thisthis问题。)

dir是等效的窗口,但与ls相比,它将打印不同格式的输出,并且可能这个调用是从目录中获取某种信息。有更好的方法在python中执行此操作。如果你可以识别它想要获取的信息(例如权限位),那么你可能能够编写一个纯python版本(或者为那些执行此操作的Windows找到一个等效的python代码段)而不依赖于外部命令。

有趣的是,subprocess.call()只是运行命令并返回错误代码。 ls本身只打印信息,因此如果这是意图(只是为了向用户显示控制台中的目录内容),那么您可以通过调用dir来替换它。有时,您需要提供shell=True作为参数,具体取决于您调用的命令。但请注意文档中的warning。如果它试图提取信息,它可能想要进行subprocess.Popen()subprocress.check_output()样式调用,您实际上可以使用被调用程序的输出。

例如,如果只是获取目录中的文件/目录列表和/或它们的时间戳,那么这是获取此信息的一种非常全面的方式,它们都可以在python本身完成例如os.walk()os.fstat()和Python3中的pathlib是获取目录中文件信息的一些方法。

答案 1 :(得分:0)

您正尝试在Windows上执行ls -l命令。 ls仅适用于基于Unix的系统。

subprocess.call(["ls", "-l"])

如果您使用的是Windows,请尝试

subprocess.call(["dir"])

代替。

或者,您可以尝试Cygwin之类的内容。