我正在用Python编写一个模块,它使用子进程模块运行C ++程序。一旦我从C ++获得输出,我需要将它存储在Python List中。我该怎么做?
答案 0 :(得分:6)
这是我使用的一种快速而肮脏的方法。
def run_cpp_thing(parameters):
proc = subprocess.Popen('mycpp' + parameters,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE)
so, se = proc.communicate()
# print se # the stderr stream
# print so # the stdio stream
# I'm going to assume so =
# "1 2 3 4 5"
# Now parse the stdio stream.
# you will obvious do much more error checking :)
# **updated to make them all numbers**
return [float(x) for x in so.next().split()]
答案 1 :(得分:2)
一种肮脏的方法:
您可以使用Python从stdin读取(raw_input)(如果没有输入,它将等待)。 C ++程序写入stdout。
答案 2 :(得分:1)
根据您的评论,假设data
包含输出:
numbers = [int(x) for x in data.split()]
我假设这些数字是由空格分隔的,并且您已经从C ++程序中获得了Python中的字符串(即,您知道如何使用subprocess
模块)。
编辑:假设您的C ++程序是:
$ cat a.cpp
#include <iostream>
int main()
{
int a[] = { 1, 2, 3, 4 };
for (int i=0; i < sizeof a / sizeof a[0]; ++i) {
std::cout << a[i] << " ";
}
std::cout << std::endl;
return 0;
}
$ g++ a.cpp -o test
$ ./test
1 2 3 4
$
然后,您可以在Python中执行此操作:
import subprocess
data = subprocess.Popen('./test', stdout=subprocess.PIPE).communicate()[0]
numbers = [int(x) for x in data.split()]
(如果您的C ++程序输出带有换行符作为分隔符的数字,或者白色空间的任意组合,则无关紧要。)
答案 3 :(得分:0)
在该过程的命令中,您可以重定向到临时文件。然后在进程返回时读取该文件。