13

サブプロセスを使用して簡単なエコー操作を実行しようとしています:

import subprocess
import shlex

cmd = 'echo $HOME'
proc = subprocess.Popen(shlex.split(cmd), shell=True, stdout=subprocess.PIPE)
print proc.communicate()[0]

しかし、それは何も印刷しません。コマンドを変更しても、echo "hello, world"何も出力されません。どんな助けでも大歓迎です。

4

2 に答える 2

17

Unix ではshell=True、2 番目以降の引数がシェル自体に対するものであることを意味し、文字列を使用してコマンドをシェルに渡します。

import subprocess

cmd = 'echo $HOME'
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
print proc.communicate()[0],

次のように書くこともできます。

import subprocess

cmd = 'echo $HOME'
print subprocess.check_output(cmd, shell=True),

サブプロセスのドキュメントから:

を使用するUnixshell=Trueでは、シェルはデフォルトで /bin/sh になります。args が文字列の場合、その文字列はシェルを介して実行するコマンドを指定します。つまり、シェル プロンプトで入力したときとまったく同じように文字列をフォーマットする必要があります。これには、たとえば、スペースを含むファイル名を引用またはバックスラッシュでエスケープすることが含まれます。args がシーケンスの場合、最初の項目はコマンド文字列を指定し、追加の項目はシェル自体への追加の引数として扱われます。つまり、Popen は以下と同等のことを行います。

Popen(['/bin/sh', '-c', args[0], args[1], ...])
于 2013-06-21T02:51:46.010 に答える
1

Popen の 2 つの異なる呼び出しを混同しています。これらのいずれかが機能します。

proc=subprocess.Popen(['/bin/echo', 'hello', 'world'], shell=False, stdout=subprocess.PIPE)

また

proc=subprocess.Popen('echo hello world', shell=True, stdout=subprocess.PIPE)

shell=True を渡す場合、最初の引数は文字列 (シェル コマンド ライン) です。シェルを使用しない場合、最初の引数はリストです。どちらもこれを生成します:

print proc.communicate()
('hello world\n', None)
于 2014-05-14T23:07:31.710 に答える