将os.popen(命令)读入字符串

时间:2010-02-26 04:17:43

标签: python string popen

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

gcc -E myHeader.h

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

我该怎么做?

5 个答案:

答案 0 :(得分:23)

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

import os

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

正如其他人所说,你应该使用subprocess.Popen。它被设计为os.popen {{1}}。 Python文档有safer version

答案 1 :(得分:16)

import subprocess

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

字符串preprocessed现在拥有您需要的预处理源代码 - 并且您已经使用“正确”(现代)方式对一个子进程进行shell,而不是旧的不那么喜欢 - {{1 }}

答案 2 :(得分:5)

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

How to get output from subprocess.Popen()

答案 3 :(得分:1)

自Python 2.6以来, os.popen()已被弃用。您现在应该使用子流程模块: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()

答案 4 :(得分: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)