タイトルが正しいかどうかわかりません。私がしていることは、コードの一部を自動化するためにpythonスクリプトを記述していることです。したがって、.hファイルを解析していますが、開始する前にすべてのマクロを展開したいと思います。シェルを呼び出して以下を実行します。
gcc -E myHeader.h
これにより、myHeader.hの前処理されたバージョンがstdoutに出力されます。ここで、すべての出力を文字列に直接読み込んで、さらに処理します。 popenを使用してこれを実行できることを読みましたが、パイプオブジェクトを使用したことがありません。
どうすればいいですか?
os.popen
関数は、ファイルのようなオブジェクトを返すだけです。次のように使用できます。
import os
process = os.popen('gcc -E myHeader.h')
preprocessed = process.read()
process.close()
他の人が言ったように、subprocess.Popen
を使用する必要があります。 より安全なバージョンos.popen
になるように設計されています。 Python docsには 切り替え方法を説明するセクション があります。
import subprocess
p = subprocess.popen('gcc -E myHeader.h'.split(),
stdout=subprocess.PIPE)
preprocessed, _ = p.communicate()
文字列preprocessed
に必要な前処理済みのソースが追加されました。シェルをサブプロセスに「適切な」(モダンな)方法で使用するようになりました。古いのではなく、もう好きではありませんos.popen
。
subprocess.Popen()
を使用する必要がありますSOには多数の例があります
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コンストラクターで、ShellがTrueの場合、コマンドをシーケンスとしてではなく文字列として。それ以外の場合は、コマンドをリストに分割するだけです。
command = ["gcc", "-E", "myHeader.h"] # the Shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None)
標準エラーもPopenの初期化に読み込む必要がある場合は、stderrをsubprocess.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()
通常の出力とエラー出力の両方をキャプチャする別のアプローチを次に示します。
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)