19

我不确定我的标题是否正确。我正在做的是编写一个 python 脚本来自动化我的一些代码编写。所以我正在解析一个 .h 文件。但我想在开始之前展开所有宏。所以我想调用shell:

gcc -E myHeader.h

哪个应该将 myHeader.h 的后预处理版本输出到标准输出。现在我想将所有输出直接读入一个字符串以进行进一步处理。我读过我可以用 popen 做到这一点,但我从未使用过管道对象。

我该怎么做呢?

4

5 回答 5

31

os.popen函数只返回一个类似文件的对象。你可以像这样使用它:

import os

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

正如其他人所说,您应该使用subprocess.Popen. 它被设计为更安全os.popen. Python 文档有一节描述如何切换.

于 2010-02-26T04:26:01.753 回答
17
import subprocess

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

Stringpreprocessed现在拥有您需要的预处理源——并且您使用了“正确”(现代)方式来壳到子进程,而不是旧的 not-so-liked-anymore os.popen

于 2010-02-26T06:03:23.047 回答
5

你应该使用subprocess.Popen()SO上有很多例子

如何从 subprocess.Popen() 获取输出

于 2010-02-26T04:27:51.230 回答
2

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 初始化,您可以将stderr设置为subprocess.PIPEsubprocess.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()
于 2013-04-28T19:07:58.090 回答
0

这是另一种捕获常规输出和错误输出的方法:

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)
于 2018-03-29T05:39:37.340 回答