popen用法 - python subprocess timeout



子進程調用ls時出錯 (2)

你正試圖在Windows上執行ls -l命令。 ls只能在基於Unix的系統上工作。

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

如果您在Windows上,請嘗試

subprocess.call(["dir"])

代替。

或者,你可以嘗試像Cygwin的東西。

https://code.i-harness.com

任何想法是什麼錯誤試圖說?

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

你正在窗口上調用ls命令,這個命令沒有ls 。 你可以從http://gnuwin32.sourceforge.net/packages/coreutils.htm中獲取一個ls的窗口,並將它的安裝目錄添加到你的windows PATH (或者在你的python腳本的運行時將它添加到PATH。if你不知道如何做到這一點,分別看到這個這個問題)。

dir是相當於Windows的,但是與ls相比,它會打印出不同格式的輸出,而且這個調用是從目錄中獲取某種信息的。 在Python中有更好的方法來做到這一點。 如果你可以確定它想要獲得什麼信息(比如權限位),那麼你可以編寫一個純Python版本(或者找到一個等效的Python代碼片段),而不依賴於外部命令。

有趣的是, subprocess.call()只是運行該命令並返回錯誤代碼。 ls本身只是打印信息,所以如果這是意圖(只是為了向用戶顯示控制台中的目錄內容),那麼你可以用dir的調用替換它。 有時候,根據你所調用的命令,你需要提供shell=True作為參數。 不過要注意文檔中的警告 。 如果正在嘗試提取信息,則可能需要執行subprocress.check_output()subprocress.check_output()樣式調用,其中實際上可以使用被調用程序的輸出。

例如,如果僅僅是獲取目錄中的文件/目錄列表和/或它們的時間戳,那麼這是獲取這些信息的一種非常全面的方式,並且它們都可以在python本身(例如os.walk()os.fstat() ,在Python3中, pathlib是獲取目錄中文件信息的一些方法。





dir