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")
サブプロセスで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
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
コンストラクターに直接渡す制限がなくなります。
コマンドを「&&」で結合します。
os.system('echo a > outputa.txt && echo b > outputb.txt')
コマンドを1回で実行する場合は、 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モジュールが「;」を処理しないことです。