簡體   English   中英

何時在 Python 中運行外部命令

[英]When to run external commands in Python

在 Python 中,可以運行 bash 命令來實現可以通過運行等效的 Python 代碼來實現的目標。 作為一個簡單的例子,要cd進入一個目錄並做一些事情,你可以這樣做:

import subprocess
subprocess.run('cd directory and do other stuff')

或者

import os
os.chdir(path) # path is the path to the directory
#do other stuff

那么你如何選擇使用哪一個(我的意思是一般來說,而不是這個簡化的例子)?

第一個版本只是更改了子進程的目錄。 它對原來的Python工藝沒有影響,所以實際上沒用。 只有當它是多個命令的一部分時才值得:

subprocess.run('cd directory; cat filename', shell=True)

第二個版本更改了 Python 進程本身的目錄。

更一般地說,如果有一個 Python function 與外部命令執行相同的操作,您應該更喜歡 function。 它更高效,因為它不必啟動新進程,如果使用shell=True則不必解析命令,並且您可以獲得更靈活的錯誤處理。

我不會選擇前者。 它創建一個子進程並更改該子進程內的目錄,然后終止使 Python 進程的當前目錄與調用subprocess.run之前相同。

os.chdir實際上改變了當前進程的工作目錄。 在您開始使用線程並意識到一個線程的當前目錄可能會受到來自另一個線程的os.chdir調用的影響之前,這似乎很好。

對於單線程進程(Ingorant Wandered 通常最初可能會編寫的那種),這沒有問題。

更廣泛地說,如果您需要比 Python 單獨提供的更多並行性,則期望使用subprocess模塊(研究“Python GIL”以找出為什么幼稚的 Python 進程只能使用多核計算機的一個核心)。

尼特。 subprocess.run('cd directory')只是更改了子進程的目錄,然后退出,丟棄了更改的目錄上下文。 os.chdir(path)並不總是瘋狂的,只有 99% 的瘋狂。 您最好使用os.pathpathlib來跟蹤目錄,而不是在整個程序中更改“當前”的含義。

運行外部命令有一個優勢,特別是如果它們實現了您目前沒有的功能。 它們還可以幫助您並行化您的代碼,例如運行外部grep並使用其結果。 這具有添加外部平台依賴項的缺點。

通常只是因為程序員碰巧比 python 更了解 shell。 或者在網上找到了一個 shell 的例子。 這對於業余愛好者而不是專業代碼庫來說很好。

免責聲明:恕我直言

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM