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

Lyn*_*ite 15 python string popen

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

gcc -E myHeader.h
Run Code Online (Sandbox Code Playgroud)

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

我该怎么做呢?

Bri*_*nna 26

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

import os

process = os.popen('gcc -E myHeader.h')
preprocessed = process.read()
process.close()
Run Code Online (Sandbox Code Playgroud)

正如其他人所说,你应该使用subprocess.Popen.它的设计是一个更安全的版本os.popen.Python文档有一节描述如何切换.

  • 我认为用“subprocess.Popen”替换“os.popen”的建议现在仍然有效。我认为这可以追溯到从 Python 2 到 Python 3 的过渡,当时“popen”、“popen2”、“popen3”和“popen4”已被弃用。截至 2021 年 12 月,[os.popen 的 Python 文档](https://docs.python.org/3/library/os.html#os.popen) 指出“这是使用 subprocess.Popen 实现的;请参阅该类的文档提供了更强大的子流程管理和通信方式。” (2认同)

Ale*_*lli 16

import subprocess

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

字符串preprocessed现在具有您需要的预处理源 - 并且您已经使用"正确"(现代)方式来封装到子进程,而不是旧的不那么喜欢的方式os.popen.


Joh*_*ooy 5

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

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