web-dev-qa-db-ja.com

os.popen(command)を文字列に読み込む

タイトルが正しいかどうかわかりません。私がしていることは、コードの一部を自動化するためにpythonスクリプトを記述していることです。したがって、.hファイルを解析していますが、開始する前にすべてのマクロを展開したいと思います。シェルを呼び出して以下を実行します。

gcc -E myHeader.h

これにより、myHeader.hの前処理されたバージョンがstdoutに出力されます。ここで、すべての出力を文字列に直接読み込んで、さらに処理します。 popenを使用してこれを実行できることを読みましたが、パイプオブジェクトを使用したことがありません。

どうすればいいですか?

15
Lyndon White

os.popen関数は、ファイルのようなオブジェクトを返すだけです。次のように使用できます。

import os

process = os.popen('gcc -E myHeader.h')
preprocessed = process.read()
process.close()

他の人が言ったように、subprocess.Popenを使用する必要があります。 より安全なバージョンos.popenになるように設計されています。 Python docsには 切り替え方法を説明するセクション があります。

26
Brian McKenna
import subprocess

p = subprocess.popen('gcc -E myHeader.h'.split(),
                     stdout=subprocess.PIPE)
preprocessed, _ = p.communicate()

文字列preprocessedに必要な前処理済みのソースが追加されました。シェルをサブプロセスに「適切な」(モダンな)方法で使用するようになりました。古いのではなく、もう好きではありませんos.popen

16
Alex Martelli

subprocess.Popen()を使用する必要がありますSOには多数の例があります

subprocess.Popen()から出力を取得する方法

5
John La Rooy

os.popen()は、Python 2.6から廃止されました。これで、subprocess代わりにモジュール: http://docs.python.org/2/library/subprocess.html#subprocess.Popen

import subprocess

command = "gcc -E myHeader.h"  # the Shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, Shell=True)

#Launch the Shell command:
output = process.communicate()

print output[0]

Popenコンストラクターで、ShellTrueの場合、コマンドをシーケンスとしてではなく文字列として。それ以外の場合は、コマンドをリストに分割するだけです。

command = ["gcc", "-E", "myHeader.h"]  # the Shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None)

標準エラーもPopenの初期化に読み込む必要がある場合は、stderrsubprocess.PIPEに設定できます。 またはtosubprocess.STDOUT

import subprocess

command = "gcc -E myHeader.h"  # the Shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, Shell=True)

#Launch the Shell command:
output, error = process.communicate()
1
Paolo Rovelli

通常の出力とエラー出力の両方をキャプチャする別のアプローチを次に示します。

com_str = 'uname -a'
command = subprocess.Popen([com_str], stdout=subprocess.PIPE, Shell=True)
(output, error) = command.communicate()
print output

Linux 3.11.0-20-generic  Fri May 2 21:32:55 UTC 2014 GNU/Linux

そして

com_str = 'id'
command = subprocess.Popen([com_str], stdout=subprocess.PIPE, Shell=True)
(output, error) = command.communicate()
print output

uid=1000(myname) gid=1000(myGID) groups=1000(mygrp),0(root)
0
SDsolar