簡體   English   中英

使用子進程運行多個 bash 命令

[英]running multiple bash commands with subprocess

如果我運行echo a; echo b echo a; echo b in bash 結果將是兩個命令都運行。 但是,如果我使用 subprocess 則運行第一個命令,打印出整個行的其余部分。 下面的代碼回顯a; echo b a; echo b而不是ab ,我如何讓它運行這兩個命令?

import subprocess, shlex
def subprocess_cmd(command):
    process = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE)
    proc_stdout = process.communicate()[0].strip() 
    print proc_stdout

subprocess_cmd("echo a; echo b")

您必須在子進程中使用 shell=True 並且沒有 shlex.split:

import subprocess

command = "echo a; echo b"

ret = subprocess.run(command, capture_output=True, shell=True)

# before Python 3.7:
# ret = subprocess.run(command, stdout=subprocess.PIPE, shell=True)

print(ret.stdout.decode())

返回:

a
b

我只是偶然發現了一種情況,我需要從 python 中運行一堆 bash 代碼(不以分號分隔)。 在這種情況下,建議的解決方案沒有幫助。 一種方法是保存文件,然后使用Popen運行它,但在我的情況下這是不可能的。

我最終做的是這樣的:

commands = '''
echo "a"
echo "b"
echo "c"
echo "d"
'''

process = subprocess.Popen('/bin/bash', stdin=subprocess.PIPE, stdout=subprocess.PIPE)
out, err = process.communicate(commands)
print out

所以我首先創建子 bash 進程,然后告訴它要執行什么。 這種方法消除了將命令直接傳遞給Popen構造函數的限制。

用“&&”連接命令。

os.system('echo a > outputa.txt && echo b > outputb.txt')

如果您只是一次性運行命令,那么您可以使用subprocess.check_output便利功能:

def subprocess_cmd(command):
    output = subprocess.check_output(command, shell=True)
    print output
>>> command = "echo a; echo b"
>>> shlex.split(command);
    ['echo', 'a; echo', 'b']

所以,問題是 shlex 模塊不處理“;”

import subprocess
cmd = "vsish -e ls /vmkModules/lsom/disks/  | cut -d '/' -f 1  | while read diskID  ; do echo $diskID; vsish -e cat /vmkModules/lsom/disks/$diskID/virstoStats | grep -iE 'Delete pending |trims currently queued' ;  echo '====================' ;done ;"


def subprocess_cmd(command):
    process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)
    proc_stdout = process.communicate()[0].strip()
    for line in proc_stdout.decode().split('\n'):
        print (line)

subprocess_cmd(cmd)

當我使用 capture_output=True 時出現錯誤

TypeError: __init__() got an unexpected keyword argument 'capture_output'

在進行如下更改后,它的工作正常

import subprocess

command = '''ls'''

result = subprocess.run(command, stdout=subprocess.PIPE,shell=True)

print(result.stdout.splitlines())

暫無
暫無

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

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