[解決済み] サブプロセスの標準出力を変数にパイプする[重複]。
質問
でコマンドを実行したい。
pythong
で、サブプロセスモジュールを使ってコマンドを実行し、その出力を変数に格納したい。しかし、コマンドの出力をターミナルに出力させたくありません。
このコードに対して
def storels():
a = subprocess.Popen("ls",shell=True)
storels()
ディレクトリの一覧をターミナルで取得するのですが、その際に、ディレクトリの一覧を保存するのではなく
a
. も試しました。
def storels():
subprocess.Popen("ls > tmp",shell=True)
a = open("./tmp")
[Rest of Code]
storels()
これはまた、私のターミナルにlsの出力を表示します。私はこのコマンドをやや古い os.system メソッドで試したこともあります。
ls > tmp
をターミナルで実行しても
ls
をターミナルに出力せず、それを
tmp
. しかし、同じことが起こります。
編集してください。
marcogさんのアドバイスに従ったところ、より複雑なコマンドを実行したときだけ、以下のエラーが発生しました。
cdrecord --help
. Pythonはこれを吐き出します。
Traceback (most recent call last):
File "./install.py", line 52, in <module>
burntrack2("hi")
File "./install.py", line 46, in burntrack2
a = subprocess.Popen("cdrecord --help",stdout = subprocess.PIPE)
File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
errread, errwrite)
File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
どのように解決するのですか?
の出力を得るには
ls
の出力を得るには、次のようにします。
stdout=subprocess.PIPE
.
>>> proc = subprocess.Popen('ls', stdout=subprocess.PIPE)
>>> output = proc.stdout.read()
>>> print output
bar
baz
foo
コマンドは
cdrecord --help
は標準エラー出力をするので、代わりにそれをパイプする必要があります。また、以下のようにコマンドをトークンのリストに分割する必要がありますし、別の方法として
shell=True
を渡すこともできますが、これは本格的なシェルを起動するので、コマンド文字列の内容を制御していない場合は危険な場合があります。
>>> proc = subprocess.Popen(['cdrecord', '--help'], stderr=subprocess.PIPE)
>>> output = proc.stderr.read()
>>> print output
Usage: wodim [options] track1...trackn
Options:
-version print version information and exit
dev=target SCSI target to use as CD/DVD-Recorder
gracetime=# set the grace time before starting to write to #.
...
stdoutとstderrの両方に出力するコマンドがあり、それらをマージしたい場合、stderrをstdoutにパイプし、stdoutをキャッチすることによってそれを行うことができます。
subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
で述べたように
クリス・モーガン
を使用する必要があります。
proc.communicate()
の代わりに
proc.read()
.
>>> proc = subprocess.Popen(['cdrecord', '--help'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> out, err = proc.communicate()
>>> print 'stdout:', out
stdout:
>>> print 'stderr:', err
stderr:Usage: wodim [options] track1...trackn
Options:
-version print version information and exit
dev=target SCSI target to use as CD/DVD-Recorder
gracetime=# set the grace time before starting to write to #.
...
関連
-
[解決済み] 変数を参照渡しする方法を教えてください。
-
[解決済み] 環境変数の値にアクセスする方法
-
[解決済み] シェルコマンドの実行と出力のキャプチャ
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] Celeryタスクのユニットテストはどのように行うのですか?
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] Pythonの検索パスを他のソースに展開する
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] subprocess.Popen 呼び出しの出力を文字列で保存する [重複] 。
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] PythonでのAWS Lambdaのインポートモジュールエラー
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] 範囲指定された浮動小数点数のランダムな配列を生成します。
-
[解決済み] Celeryタスクのユニットテストはどのように行うのですか?
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] Pythonでファイルの読み込みと上書きをする
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複