簡體   English   中英

在Python中使用參數執行bash命令

[英]Execute a bash command with parameter in Python

這是我在python中運行的bash命令,並獲得了預期的結果:

count = subprocess.Popen("ps -ef | grep app | wc -l", stdout=subprocess.PIPE, shell=True)

但是當我想傳遞參數(在這種情況下為count)時,無法弄清楚該如何做。 我試過了:

pid = subprocess.call("ps -ef | grep app | awk -v n=' + str(count), 'NR==n | awk \'{print $2}\'", shell=True)

args = shlex.split('ps -ef | grep app | awk -v n=' + str(count), 'NR==n | awk \'{print $2}\'')
pid = subprocess.Popen(args, stdout=subprocess.PIPE, shell=True)

其他嘗試,來自此處的各種帖子,但仍然無法實現。

您混合了開和閉引號,並且在其他嘗試中誤將冒號傳遞了。

嘗試解決此問題:

pid = subprocess.call("ps -ef | grep app | awk -v n=" + str(count) + " NR==n | awk '{print $2}'", shell=True)

您使用"打開了命令參數,因此您需要先用"而不是' + str()將其關閉。 另外,我將, 'NR=換為+ "NR=因為您想向命令添加更多內容,而不是將參數傳遞給subprocess.call()

正如評論中指出的那樣,用shlex拆分命令是沒有shlex因為管道命令不是在subprocess shlex實現的,但是我想指出,通常不建議使用shell=True因為例如給出示例之一在這里

另一種說法是使用格式:

pid = subprocess.call("ps -ef | grep app | awk -v n={} NR==n | awk '{{print $2}}'".format(str(count)), shell=True)

你awk中的管道可以簡化很大-如果我們的目標是打印的最后一場比賽, ps -ef | awk '/app/ { p=$2 } END { print p }' ps -ef | awk '/app/ { p=$2 } END { print p }'做到了。 但是很多時候,從Python運行Awk只是愚蠢的事情,並且在Python中執行過濾既方便又容易,而且效率顯然更高(不僅節省了Awk進程,還節省了討厭的shell=True )。

for p in subprocess.check_output(['ps', '-ef']).split('\n'):
    if 'app' in p:
        pid = p.split()[1]

暫無
暫無

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

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