當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python subprocess.Popen用法及代碼示例


用法:

class subprocess.Popen(args, bufsize=- 1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, group=None, extra_groups=None, user=None, umask=- 1, encoding=None, errors=None, text=None, pipesize=- 1)

在新進程中執行子程序。在 POSIX 上,該類使用類似 os.execvpe() 的行為來執行子程序。在 Windows 上,該類使用 Windows CreateProcess() 函數。 Popen 的參數如下。

args 應該是程序參數序列,或者是單個字符串或 path-like 對象。默認情況下,如果args 是一個序列,則要執行的程序是args 中的第一項。如果args 是字符串,則解釋取決於平台,如下所述。請參閱 shellexecutable 參數以了解與默認行為的其他差異。除非另有說明,否則建議將args 作為序列傳遞。

警告

為了獲得最大的可靠性,請為可執行文件使用完全限定的路徑。在上搜索不合格的名稱PATH, 采用shutil.which().在所有平台上,通過sys.executable是再次啟動當前 Python 解釋器的推薦方法,並使用-m命令行 格式以啟動已安裝的模塊。

解析 executable 的路徑(或 args 的第一項)取決於平台。對於 POSIX,請參閱 os.execvpe() ,並注意在解析或搜索可執行路徑時,cwd 會覆蓋當前工作目錄,而 env 可以覆蓋 PATH 環境變量。對於 Windows,請參閱 WinAPI CreateProcesslpApplicationNamelpCommandLine 參數的文檔,並注意使用 shell=False 解析或搜索可執行路徑時,cwd 不會覆蓋當前工作目錄並且env 不能覆蓋PATH 環境變量。使用完整路徑可以避免所有這些變化。

將一些參數作為序列傳遞給外部程序的示例是:

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])

在 POSIX 上,如果 args 是字符串,則該字符串被解釋為要執行的程序的名稱或路徑。但是,隻有在不向程序傳遞參數的情況下才能做到這一點。

注意

如何將 shell 命令分解為一係列參數可能並不明顯,尤其是在複雜情況下。 shlex.split() 可以說明如何確定 args 的正確標記化:

>>> import shlex, subprocess
>>> command_line = input()
/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
>>> args = shlex.split(command_line)
>>> print(args)
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
>>> p = subprocess.Popen(args) # Success!

請特別注意,shell 中由空格分隔的選項(例如 -input )和參數(例如 eggs.txt )位於單獨的列表元素中,而在 shell 中使用時需要引用或反斜杠轉義的參數(例如因為包含空格的文件名或上麵顯示的echo 命令)是單個列表元素。

在 Windows 上,如果 args 是一個序列,它將按照在 Windows 上將參數序列轉換為字符串中所述的方式轉換為字符串。這是因為底層的CreateProcess() 對字符串進行操作。

在 3.6 版中更改:args參數接受一個path-like 對象如果shellFalse以及在 POSIX 上包含 path-like 對象的序列。

在 3.8 版中更改:args參數接受一個path-like 對象如果shellFalse以及在 Windows 上包含字節和 path-like 對象的序列。

shell 參數(默認為 False )指定是否使用 shell 作為程序來執行。如果 shellTrue ,建議將 args 作為字符串而不是序列傳遞。

在帶有 shell=True 的 POSIX 上,shell 默認為 /bin/sh 。如果args 是字符串,則該字符串指定要通過shell 執行的命令。這意味著字符串的格式必須與在 shell 提示符下鍵入時的格式完全相同。這包括,例如,引用或反斜杠轉義文件名,其中包含空格。如果args 是一個序列,則第一項指定命令字符串,任何附加項都將被視為 shell 本身的附加參數。也就是說,Popen 相當於:

Popen(['/bin/sh', '-c', args[0], args[1], ...])

在 Windows 上shell=True, 這COMSPEC環境變量指定默認 shell 。唯一需要指定的時間shell=True在 Windows 上是當您希望執行的命令被內置到 shell 中時(例如目錄或者複製)。你不需要shell=True運行批處理文件或基於控製台的可執行文件。

注意

在使用 shell=True 之前閱讀 Security Considerations 部分。

在創建 stdin/stdout/stderr 管道文件對象時,bufsize 將作為 open() 函數的相應參數提供:

  • 0 表示無緩衝(讀寫是一個係統調用,可以短返回)
  • 1 表示行緩衝(僅在 universal_newlines=True 即在文本模式下可用)
  • 任何其他正值意味著使用大約該大小的緩衝區
  • 負 bufsize(默認值)表示將使用 io.DEFAULT_BUFFER_SIZE 的係統默認值。

在 3.3.1 版中更改:bufsize現在默認為 -1 以默認啟用緩衝以匹配大多數代碼所期望的行為。在 Python 3.2.4 和 3.3.1 之前的版本中,它錯誤地默認為0這是無緩衝的,允許短讀。這是無意的,並且與大多數代碼預期的 Python 2 的行為不匹配。

executable參數指定要執行的替換程序。很少需要它。什麽時候shell=False,executable替換由指定的要執行的程序args.然而,原args仍然傳遞給程序。大多數程序處理由指定的程序args作為命令名稱,它可能與實際執行的程序不同。在 POSIX 上,argsname 成為實用程序中可執行文件的顯示名稱,例如ps.如果shell=True, 在 POSIX 上executable參數指定默認的替換 shell /bin/sh.

在 3.6 版中更改:executable參數接受一個path-like 對象在 POSIX 上。

在 3.8 版中更改:executable參數接受一個字節和path-like 對象在 Windows 上。

stdinstdoutstderr 分別指定執行程序的標準輸入、標準輸出和標準錯誤文件句柄。有效值為 PIPEDEVNULL 、現有文件說明符(正整數)、具有有效文件說明符的現有文件對象和 NonePIPE 表示應該創建一個到子節點的新管道。 DEVNULL 表示將使用特殊文件os.devnull。使用默認設置 None ,不會發生重定向;子文件句柄將從父文件繼承。此外,stderr 可以是 STDOUT ,這表明來自應用程序的 stderr 數據應被捕獲到與 stdout 相同的文件句柄中。

如果 preexec_fn 設置為可調用對象,則該對象將在子進程執行之前在子進程中調用。 (僅限 POSIX)

警告

preexec_fn 參數在應用程序中存在線程時使用是不安全的。在調用 exec 之前,子進程可能會死鎖。如果您必須使用它,請保持微不足道!盡量減少調用的庫數量。

注意

如果您需要為孩子修改環境,請使用 env 參數,而不是在 preexec_fn 中進行。 start_new_session 參數可以代替以前常用的preexec_fn 在子進程中調用 os.setsid()。

在 3.8 版中更改: preexec_fn子解釋器不再支持參數。在子解釋器中使用參數會引發RuntimeError.新限製可能會影響部署在mod_wsgi、uWSGI 和其他嵌入式環境中的應用程序。

如果 close_fds 為真,則除了 012 之外的所有文件說明符都將在子進程執行之前關閉。否則,當close_fds 為假時,文件說明符遵循其可繼承標誌,如文件說明符的繼承中所述。

在 Windows 上,如果 close_fds 為真,則子進程不會繼承任何句柄,除非在 STARTUPINFO.lpAttributeListhandle_list 元素中顯式傳遞,或者通過標準句柄重定向。

在 3.2 版中更改:默認為close_fds從改變False到上麵說明的。

在 3.7 版中更改:在 Windows 上,默認為close_fds從改變FalseTrue重定向標準句柄時。現在可以設置close_fdsTrue重定向標準句柄時。

pass_fds 是一個可選的文件說明符序列,用於在父子節點之間保持打開狀態。提供任何 pass_fds 強製 close_fdsTrue 。 (僅限 POSIX)

在 3.2 版中更改: pass_fds添加了參數。

如果 cwd 不是 None ,則函數在執行子進程之前將工作目錄更改為 cwdcwd 可以是字符串、字節或 path-like 對象。在 POSIX 上,如果可執行路徑是相對路徑,則函數查找相對於 cwdexecutable(或 args 中的第一項)。

在 3.6 版中更改:cwd參數接受一個path-like 對象在 POSIX 上。

在 3.7 版中更改:cwd參數接受一個path-like 對象在 Windows 上。

在 3.8 版中更改:cwd參數在 Windows 上接受字節對象。

如果 restore_signals 為真(默認值),Python 設置為 SIG_IGN 的所有信號都將在 exec 之前的子進程中恢複為 SIG_DFL。目前這包括 SIGPIPE、SIGXFZ 和 SIGXFSZ 信號。 (僅限 POSIX)

在 3.2 版中更改:restore_signals加入。

如果start_new_session 為真,setsid() 係統調用將在子進程執行之前在子進程中進行。 (僅限 POSIX)

在 3.2 版中更改:start_new_session加入。

如果 group 不是 None ,則 setregid() 係統調用將在子進程執行之前在子進程中進行。如果提供的值是一個字符串,它將通過grp.getgrnam() 查找並使用gr_gid 中的值。如果該值是整數,則將逐字傳遞。 (僅限 POSIX)

可用性:POSIX

3.9 版中的新函數。

如果 extra_groups 不是 None ,則 setgroups() 係統調用將在子進程執行之前在子進程中進行。 extra_groups 中提供的字符串將通過grp.getgrnam() 查找,並使用gr_gid 中的值。整數值將逐字傳遞。 (僅限 POSIX)

可用性:POSIX

3.9 版中的新函數。

如果 user 不是 None ,則 setreuid() 係統調用將在子進程執行之前在子進程中進行。如果提供的值是一個字符串,它將通過pwd.getpwnam() 查找並使用pw_uid 中的值。如果該值是整數,則將逐字傳遞。 (僅限 POSIX)

可用性:POSIX

3.9 版中的新函數。

如果umask 不為負,則在子進程執行之前,將在子進程中進行umask() 係統調用。

可用性:POSIX

3.9 版中的新函數。

如果 env 不是 None ,則必須是為新進程定義環境變量的映射;這些用於代替繼承當前進程環境的默認行為。

注意

如果指定,env必須提供程序執行所需的任何變量。在 Windows 上,為了運行side-by-side 組裝指定的env 必須包括一個有效的SystemRoot.

如果指定了 encodingerrors,或者 text 為真,則文件對象 stdinstdoutstderr 將使用指定的編碼和 errors 以文本模式打開,如上文所述常用參數。 universal_newlines 參數等效於 text 並提供向後兼容性。默認情況下,文件對象以二進製模式打開。

3.6 版中的新函數:encodingerrors添加。

3.7 版中的新函數:text被添加為更易讀的別名universal_newlines.

如果給定,startupinfo 將是一個 STARTUPINFO 對象,它被傳遞給底層的 CreateProcess 函數。 creationflags 如果給定,可以是以下一個或多個標誌:

PIPE 用於 stdinstdoutstderr 時,pipesize 可用於更改管道的大小。管道的大小僅在支持此函數的平台上更改(在撰寫本文時僅 Linux)。其他平台將忽略此參數。

3.10 版中的新函數: pipesize添加了參數。

通過with 語句支持 Popen 對象作為上下文管理器:退出時,標準文件說明符關閉,並等待進程。

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())

Popen 和此模塊中使用它的其他函數引發審計事件 subprocess.Popen 帶有參數 executableargscwdenvargs 的值可能是單個字符串或字符串列表,具體取決於平台。

在 3.2 版中更改:添加了上下文管理器支持。

在 3.6 版中更改:Popen 析構函數現在發出一個ResourceWarning如果子進程仍在運行,則發出警告。

在 3.8 版中更改:Popen 可以使用os.posix_spawn()在某些情況下以獲得更好的性能。在 Linux 和 QEMU 用戶仿真的 Windows 子係統上,使用 Popen 構造函數os.posix_spawn()不再對缺少程序等錯誤引發異常,但子進程以非零值失敗returncode.

相關用法


注:本文由純淨天空篩選整理自python.org大神的英文原創作品 subprocess.Popen。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。