如何在Python中實作Subprocess.call的非阻塞執行?

Barbara Streisand
發布: 2024-10-19 13:53:02
原創
777 人瀏覽過

How to Achieve Non-Blocking Execution of Subprocess.call in Python?

非阻塞subprocess.call:實作並行腳本執行

在Python 程式中執行asubprocess.call() 時,呼叫者通常等待者子進程完成後再繼續。但是,對於某些應用程序,可能需要使子進程成為非阻塞,從而允許呼叫者在子進程並發運行時繼續執行。

問題場景

考慮以下場景:您希望從「main.py」程式啟動「slave.py」腳本作為非阻塞subprocess.call()。當後者第一次啟動時,您需要將參數從「main.py」傳遞給「slave.py」一次,但之後不需要在腳本之間進行進一步的通訊。

解決方案:subprocess.Popen

要實現「slave.py」的非阻塞執行,請將「main.py」中的「subprocess.call( )”替換為“subprocess.Popen()”,而不是等待子進程完成後,“subprocess.Popen()”立即返回,允許“main.py”繼續操作。

程式碼範例

<code class="python">import subprocess
import sys

subprocess.Popen(["python", "slave.py"] + sys.argv[1:])</code>
登入後複製

替代方案:asyncio

對於較新版本的Python(3.5 或更高(3.版本),您可以利用“asyncio”模組來實現非阻塞子進程調用,此方法利用協程的並發性來執行多個任務。

程式碼範例(asyncio)

<code class="python">import asyncio

async def do_subprocess():
    proc = await asyncio.create_subprocess_exec('sleep', '5')
    returncode = await proc.wait()
    print(f'Subprocess done sleeping. Return code = {returncode}')

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(do_subprocess()))
loop.close()</code>
登入後複製

附加說明

  • 當使用「shell」 ,」請記住避免使用清單來傳遞參數,因為這可能會導致安全漏洞。
  • 提供的 MCVE(最小完整可驗證範例)示範了使用“subprocess.Popen( )”和“asyncio”,在實際環境中展示這個概念。

以上是如何在Python中實作Subprocess.call的非阻塞執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!