我不确定我的标题是否正确。 我在做什么是写一个python脚本来自动化我的一些代码写作。 所以我通过.h文件解析。 但我想在开始之前展开所有宏。 所以我想做一个调用外壳:将os.popen(命令)读入字符串
gcc -E myHeader.h
原本应该出来把myHeader.h一职前处理版本到标准输出。 现在我想将所有输出直接读入一个字符串中作进一步处理。 我读过,我可以用popen做到这一点,但我从来没有使用管道对象。
我如何做到这一点?
我不确定我的标题是否正确。 我在做什么是写一个python脚本来自动化我的一些代码写作。 所以我通过.h文件解析。 但我想在开始之前展开所有宏。 所以我想做一个调用外壳:将os.popen(命令)读入字符串
gcc -E myHeader.h
原本应该出来把myHeader.h一职前处理版本到标准输出。 现在我想将所有输出直接读入一个字符串中作进一步处理。 我读过,我可以用popen做到这一点,但我从来没有使用管道对象。
我如何做到这一点?
os.popen
函数只是返回一个类文件对象。您可以使用它像这样:
import os
process = os.popen('gcc -E myHeader.h')
preprocessed = process.read()
process.close()
正如其他人所说,你应该使用subprocess.Popen
。它的设计是的os.popen
。 Python文档有一个section describing how to switch over。
你应该使用subprocess.Popen()
上有SO
import subprocess
p = subprocess.popen('gcc -E myHeader.h'.split(),
stdout=subprocess.PIPE)
preprocessed, _ = p.communicate()
字符串preprocessed
现在无数的例子有你需要的预处理源 - 你已经使用了“正确”(现代)的方式以壳为一个子过程,而不是旧的不那么喜欢,os.popen
。
非常好的例子。有没有办法将stdout和stderr流分开? – smith324 2011-04-05 06:19:21
os.popen()自Python 2.6以来已被弃用。您现在应该使用子模块来代替: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构造,如果壳是真,你应该通过命令作为一个字符串,而不是作为一个序列。否则,只拆分命令到列表:
command = ["gcc", "-E", "myHeader.h"] # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None)
如果你也需要阅读标准错误,进入POPEN初始化,您可以设置标准错误到subprocess.PIPE或subprocess.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()
重复:http://stackoverflow.com/search?q=%5Bpython%5D+subprocess+output,http://stackoverflow.com/questions/1180606/using-subprocess-popen-for即使如此,为了清楚和充分的问题+1,以及“post p再加工”。 :) – 2010-02-26 04:22:54