web-dev-qa-db-ja.com

サブプロセスで複数のbashコマンドを実行する

Bashでecho a; echo bを実行すると、両方のコマンドが実行されます。ただし、サブプロセスを使用すると、最初のコマンドが実行され、残りの行全体が出力されます。以下のコードはa; echo bではなくa bをエコーし​​ますが、両方のコマンドを実行するにはどうすればよいですか?

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")
31
Paul

サブプロセスでShell = Trueを使用し、shlex.splitを使用しないでください:

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

subprocess_cmd('echo a; echo b')

返却値:

a
b
58
bougui

Python内から(セミコロンで区切られていない)一連のbashコードを実行する必要がある状況に出くわしました。このシナリオでは、提案されたソリューションは役に立ちません。 1つの方法は、ファイルを保存してから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コンストラクターに直接渡す制限がなくなります。

14
admenva

コマンドを「&&」で結合します。

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

コマンドを1回で実行する場合は、 subprocess.check_output 便利な関数:

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

そのため、問題はshlexモジュールが「;」を処理しないことです。

1
David.Zheng