用子进程编译c ++

时间:2013-08-11 12:20:34

标签: python python-3.x

我似乎没有在mac上运行编译文件的输出,但由于某种原因它在Windows上运行。

TEST.CPP

#include<iostream>
using namespace std;
int main()
{
    cout << "Hello world" << endl;
    return 0;
}

的Python

p = subprocess.Popen([r"/usr/bin/g++", "-Wall", "-o", "test", 'test.cpp'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()
p = subprocess.Popen(["test"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()

只返回空输出:

(b'', b'')

在mac上运行我需要做些什么吗?

2 个答案:

答案 0 :(得分:2)

编译很顺利,你的代码没有问题,因此没有输出:

('', '')

由于您使用的是POSIX系统,Mac,您尝试执行二进制文件而不在生成的二进制文件test前面指定“./”。因此,你的命令应该是:

p = subprocess.Popen(["./test"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
#                      ^^
p.communicate()

这应该给你:

('Hello world\n', '')

正如所料。

另一点需要注意的是,如果您已将二进制文件的位置添加到$PATH shell变量,则无需键入./test。但是,因为二进制文件不在$PATH中,所以shell无法找到可执行文件 - 这就是为什么需要指定二进制**相对于脚本执行目录的位置。

但是,请注意,如果您正在为跨平台开发(即包括对Windows的支持)执行此操作,那么该方法将无效 - 您的方法将 - 即仅使用二进制名称< / em>但你必须改变安装编译器的路径。如果您正在使用Cygwin,那么上面显示的方法也可以使用。如果是Mingw或VS,只需要可执行文件名即可,就像在这个例子中一样:

p = subprocess.Popen(["C:\\gcc\\bin\\g++.exe", "-Wall", "-o", "test.exe", 'test.cpp'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()
p = subprocess.Popen(["test.exe"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
#                    
p.communicate()

参考:

Python subprocess output on windows?

答案 1 :(得分:1)

在Mac和其他基于UNIX的操作系统中,要执行文件,您必须在文件名前加./

因此,要执行名为test的文件,您必须说:./test

使用这些知识,您的代码应修改为以下内容:

p = subprocess.Popen([r"/usr/bin/g++", "-Wall", "-o", "test", 'test.cpp'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()
p = subprocess.Popen(["./test"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()