您好,登錄后才能下訂單哦!
今天小編給大家分享一下Python異步在非阻塞子進程中運行命令的方法是什么的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
我們可以從 asyncio 執行命令。該命令將在我們可以使用非阻塞 I/O 寫入和讀取的子進程中運行。
asyncio.subprocess.Process 類提供了由 asyncio 運行的子進程的表示。它在 asyncio 程序中提供子進程的句柄,允許對其執行操作,例如等待和終止它。
該 API 與 multiprocessing.Process 類非常相似,可能與 subprocess.Popen 類更相似。具體來說,它與 subprocess.Popen 共享 wait()、communicate() 和 send_signal() 等方法以及 stdin、stdout 和 stderr 等屬性。
現在我們知道了 asyncio.subprocess.Process 類是什么,讓我們看看如何在我們的 asyncio 程序中使用它。
我們不直接創建 asyncio.subprocess.Process。相反,在 asyncio 程序中執行子進程時,會為我們創建一個類的實例。
有兩種方法可以將外部程序作為子流程執行并獲取 Process 實例,它們是:
asyncio.create_subprocess_exec() 用于直接運行命令。
asyncio.create_subprocess_shell() 用于通過 shell 運行命令。
讓我們依次看一下每個示例。
命令是在命令行(終端或命令提示符)上執行的程序。這是另一個直接運行的程序。
Linux 和 macOS 上的常見示例可能是:
‘ls’ 列出目錄的內容
‘cat’報告文件的內容
“data”報告日期
‘echo’ 報告一個字符串
‘sleep’ 睡眠幾秒鐘
我們可以通過 create_subprocess_exec() 函數從 asyncio 程序執行命令。
asyncio.create_subprocess_exec() 函數接受一個命令并直接執行它。
這很有用,因為它允許命令在子進程中執行,并允許 asyncio 協程讀取、寫入和等待它。
與 asyncio.create_subprocess_shell() 函數不同,asyncio.create_subprocess_exec() 不會使用 shell 執行命令。
這意味著 shell 提供的功能,例如 shell 變量、腳本和通配符,在執行命令時不可用。
這也意味著執行命令可能更安全,因為沒有機會進行 shell 注入。
現在我們知道了 asyncio.create_subprocess_exec() 的作用,讓我們看看如何使用它。
asyncio.create_subprocess_exec() 函數將在子進程中執行給定的字符串命令。
它返回一個代表子進程的 asyncio.subprocess.Process 對象。
create_subprocess_exec() 函數是一個協程,這意味著我們必須等待它。它會在子流程啟動后返回,而不是在子流程完成時返回。
... # execute a command in a subprocess process = await asyncio.create_subprocess_exec('ls')
正在執行的命令的參數必須作為后續參數提供給 create_subprocess_exec() 函數。
... # execute a command with arguments in a subprocess process = await asyncio.create_subprocess_exec('ls', '-l')
我們可以通過等待 wait() 方法來等待子進程完成。
... # wait for the subprocess to terminate await process.wait()
我們可以通過調用 terminate() 或 kill() 方法直接停止子進程,這將在子進程中引發一個信號。
... # terminate the subprocess process.terminate()
命令的輸入和輸出將由 stdin、stderr 和 stdout 處理。我們可以讓 asyncio 程序處理子進程的輸入或輸出。
這可以通過指定輸入或輸出流并指定要重定向的常量來實現,例如 asyncio.subprocess.PIPE。
例如,我們可以將命令的輸出重定向到 asyncio 程序:
... # start a subprocess and redirect output process = await asyncio.create_subprocess_exec('ls', stdout=asyncio.subprocess.PIPE)
然后我們可以通過 asyncio.subprocess.Process 實例通過 communicate() 方法讀取程序的輸出。
此方法是協程,必須等待。它用于通過子流程發送和接收數據。
... # read data from the subprocess line = process.communicate()
我們還可以通過以字節為單位設置“input”參數,通過 communicate() 方法將數據發送到子進程。
... # start a subprocess and redirect input process = await asyncio.create_subprocess_exec('ls', stdin=asyncio.subprocess.PIPE) # send data to the subprocess process.communicate(input=b'Hello\n')
在后臺,asyncio.subprocess.PIPE 將子進程配置為指向 StreamReader 或 StreamWriter,用于向子進程發送數據或從子進程發送數據,并且 communicate() 方法將從配置的讀取器讀取或寫入字節。
我們可以通過子進程通過 stdin、stdout 和 stderr 屬性直接與 StreamReader 或 StreamWriter 交互。
... # read a line from the subprocess output stream line = await process.stdout.readline()
現在我們知道如何使用 create_subprocess_exec() 函數,讓我們看一些工作示例。
我們可以探索如何在 asyncio 的子進程中運行命令。在這個例子中,我們將執行“echo”命令來報告一個字符串。
echo 命令將直接在標準輸出上報告提供的字符串。下面列出了完整的示例。
請注意,此示例假設您可以訪問“echo”命令,我不確定它是否適用于 Windows。
# SuperFastPython.com # example of executing a command as a subprocess with asyncio import asyncio # main coroutine async def main(): # start executing a command in a subprocess process = await asyncio.create_subprocess_exec('echo', 'Hello World') # report the details of the subprocess print(f'subprocess: {process}') # entry point asyncio.run(main())
運行示例首先創建 main() 協程并將其作為 asyncio 程序的入口點執行。
main() 協程運行并調用 create_subprocess_exec() 函數來執行命令。
main() 協程在創建子進程時掛起。返回一個 Process 實例。
main() 協程恢復并報告子進程的詳細信息。 main() 進程終止,asyncio 程序終止。
echo 命令的輸出在命令行上報告。這突出了我們如何從 asyncio 程序執行命令。
Hello World subprocess: <Process 50249>
我們可以使用 shell 執行命令。shell 是命令行的用戶界面,稱為命令行解釋器 (CLI)。它將代表用戶解釋和執行命令。
它還提供諸如用于腳本、通配符、管道、shell 變量(例如 PATH)等的原始編程語言等功能。
例如,我們可以將一條命令的輸出重定向為另一條命令的輸入,比如將“/etc/services”文件的內容重定向到word count命令“wc”中,統計行數:
cat /etc/services | wc -l
基于 Unix 的操作系統中的 shell 示例包括:
shell 已經在運行,它被用來啟動 Python 程序。您無需執行任何特殊操作即可獲取或訪問 shell。
我們可以通過 create_subprocess_shell() 函數從 asyncio 程序執行命令。
asyncio.create_subprocess_shell() 函數接受一個命令并使用當前用戶 shell 執行它。
這很有用,因為它不僅允許執行命令,還允許使用 shell 的功能,例如重定向、通配符等。
該命令將在執行 asyncio 程序的進程的子進程中執行。重要的是,asyncio 程序能夠與子進程異步交互,例如通過協程。
通過 shell 而不是直接執行命令時,可能會有安全考慮。
這是因為請求執行命令和正在執行的命令之間至少存在一層間接和解釋,允許可能的惡意注入。
現在我們知道了 asyncio.create_subprocess_shell() 的作用,讓我們看看如何使用它。
asyncio.create_subprocess_shell() 函數將通過當前 shell 執行給定的字符串命令。
它返回一個表示進程的 asyncio.subprocess.Process 對象。
它與我們在上一節中看到的 create_subprocess_shell() 函數非常相似。不過,我們將回顧如何使用該函數以及如何通過 Process 實例與流程交互(以防您直接跳到本節)。
create_subprocess_shell() 函數是一個協程,這意味著我們必須等待它。它會在子流程啟動后返回,而不是在子流程完成時返回。
... # start a subprocess process = await asyncio.create_subprocess_shell('ls')
我們可以通過等待 wait() 方法來等待子進程完成。
... # wait for the subprocess to terminate await process.wait()
我們可以通過調用 terminate() 或 kill() 方法直接停止子進程,這將在子進程中引發一個信號。
命令的輸入和輸出將由 shell 處理,例如標準輸入、標準錯誤和標準輸出。
我們可以讓 asyncio 程序處理子進程的輸入或輸出。
這可以通過指定輸入或輸出流并指定要重定向的常量來實現,例如 asyncio.subprocess.PIPE。
例如,我們可以將命令的輸出重定向到 asyncio 程序:
... # start a subprocess and redirect output process = await asyncio.create_subprocess_shell('ls', stdout=asyncio.subprocess.PIPE)
然后我們可以通過 asyncio.subprocess.Process 實例通過 communicate() 方法讀取程序的輸出。
此方法是協程,必須等待。它用于通過子流程發送和接收數據。
... # read data from the subprocess line = process.communicate()
我們還可以通過以字節為單位設置“input”參數,通過 communicate() 方法將數據發送到子進程。
... # start a subprocess and redirect input process = await asyncio.create_subprocess_shell('ls', stdin=asyncio.subprocess.PIPE) # send data to the subprocess process.communicate(input=b'Hello\n')
在后臺,asyncio.subprocess.PIPE 將子進程配置為指向 StreamReader 或 StreamWriter,用于向子進程發送數據或從子進程發送數據,并且 communicate() 方法將從配置的讀取器讀取或寫入字節。
我們可以通過子進程通過 stdin、stdout 和 stderr 屬性直接與 StreamReader 或 StreamWriter 交互。
... # read a line from the subprocess output stream line = await process.stdout.readline()
現在我們知道如何使用 create_subprocess_shell() 函數,讓我們看一些工作示例。
我們可以探索如何使用 shell 在 asyncio 的子進程中運行命令。在這個例子中,我們將執行“echo”命令來報告一個字符串。
echo 命令將直接在標準輸出上報告提供的字符串。下面列出了完整的示例。
請注意,此示例假設您可以訪問“echo”命令,我不確定它是否適用于 Windows。
# SuperFastPython.com # example of executing a shell command as a subprocess with asyncio import asyncio # main coroutine async def main(): # start executing a shell command in a subprocess process = await asyncio.create_subprocess_shell('echo Hello World') # report the details of the subprocess print(f'subprocess: {process}') # entry point asyncio.run(main())
運行示例首先創建 main() 協程并將其作為 asyncio 程序的入口點執行。main() 協程運行并調用 create_subprocess_shell() 函數來執行命令。
main() 協程運行并調用 create_subprocess_shell() 函數來執行命令。main() 協程恢復并報告子進程的詳細信息。 main() 進程終止,asyncio 程序終止。
echo 命令的輸出在命令行上報告。這突出顯示了我們如何使用 shell 從 asyncio 程序執行命令。
subprocess: <Process 43916> Hello World
以上就是“Python異步在非阻塞子進程中運行命令的方法是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。