我不确定我的标题是否正确。 我正在做的是编写一个 python 脚本来自动化我的一些代码编写。 所以我正在解析 .h 文件。 但我想在开始之前展开所有宏。 所以我想调用 shell 来:
gcc -E myHeader.h
这应该将 myHeader.h 的后预处理版本输出到标准输出。 现在我想将所有输出直接读入字符串中以进行进一步处理。 我读过可以用 popen 来做到这一点,但我从未使用过管道对象。
我该怎么做?
import subprocess
p = subprocess.Popen('gcc -E myHeader.h'.split(),
stdout=subprocess.PIPE)
preprocessed, _ = p.communicate()
String
preprocessed
现在拥有您需要的预处理源 - 并且您已经使用了“正确”(现代)的方式来 shell 到子进程,而不是旧的不再喜欢的os.popen
。
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 或 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()
这是另一种捕获常规输出和错误输出的方法:
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)