調用subprocess的推薦方法是對於它可以處理的所有使用場景都使用run()
函數。
run()
函數是在Python 3.5中添加的,如果在老版本中使用,需要下載並擴展。
擴展安裝方式:
$ pip install subprocess.run
使用方式:
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False)
運行args描述的命令。等待命令完成,然后返回一個CompletedProcess
實例。
完整的函數形式很大程度上與Popen構造函數相同 —— 除timeout、input和check之外,該函數的所有參數都傳遞給Popen接口。
>>> subprocess.run(["ls", "-l"]) # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)
>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')
class subprocess.CompletedProcess表示從run()
返回的值,表示已完成的進程。
參數
args
args是所有調用所必需的,應該為一個字符串或一個程序參數序列。通常傾向提供參數序列,因為它允許這個模塊來處理任何所需的轉義和引用參數(例如,允許文件名中的空格)。如果傳遞單個字符串,shell必須為True
(見下文),否則字符串必須簡單地命名要執行的程序而不指定任何參數。
stdin、stdout和stderr
stdin、stdout和stderr分別指定執行程序的標准輸入,標准輸出和標准錯誤文件句柄。有效值有PIPE
、DEVNULL
,一個存在的文件描述器(正整數),一個存在的文件對象和None。PIPE表示應該為子進程創建新的管道。DEVNULL表示將使用特殊文件os.devnull。使用默認設置None,則不會發生重定向;子進程的文件句柄將從父進程繼承。此外,stderr可以是STDOUT,表示來自子進程的標准錯誤數據應該捕獲到與stdout相同的文件句柄中。
shell
如果shell是True,則將通過shell執行指定的命令。如果你使用Python主要是由於它能提供大多數系統shell不能提供的增強的控制流,並且仍然希望方便地訪問其他shell功能,如shell管道、文件名通配符、環境變量擴展和擴展〜到用戶的主目錄,這會很有用。
>>> from subprocess import run
>>> print run('uname -r')
3.7.0-7-generic
>>> print run('uname -r').stdout
3.7.0-7-generic
>>> run('uname -a').status
0
>>> print run('rm not_existing_directory').stderr
rm: cannot remove `not_existing_directory': No such file or directory
>>> print run('ls -la', 'wc -l')
14
>>> print run('ls -la', 'wc -l', 'wc -c')
3
>>> run('ls -la', 'wc -l', 'wc -c')
ls -la | wc -l | wc -c
>>> print run('ls -la').stdout.lines
['total 20',
'drwxrwxr-x 3 user user 4096 Dec 20 22:55 .',
'drwxrwxr-x 5 user user 4096 Dec 20 22:57 ..',
'drwxrwxr-x 2 user user 4096 Dec 20 22:37 dir',
'-rw-rw-r-- 1 user user 0 Dec 20 22:52 file']