Python 编译c++;带子进程

Python 编译c++;带子进程,python,python-3.x,Python,Python 3.x,在mac上运行编译后的文件,我似乎无法获得输出,但出于某种原因,它在windows上工作 测试.cpp #include<iostream> using namespace std; int main() { cout << "Hello world" << endl; return 0; } 只需返回空输出: (b'', b'') 要在mac上运行,我还需要做些什么吗?编译进行得很好,您的代码没有问题,因此没有输出: ('', '')

在mac上运行编译后的文件,我似乎无法获得输出,但出于某种原因,它在windows上工作

测试.cpp

#include<iostream>
using namespace std;
int main()
{
    cout << "Hello world" << endl;
    return 0;
}
只需返回空输出:

(b'', b'')

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

编译进行得很好,您的代码没有问题,因此没有输出:

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

p = subprocess.Popen(["./test"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
#                      ^^
p.communicate()
这应该给你:

('Hello world\n', '')
正如所料

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

但是,请注意,如果您是为了跨平台开发(即包括对Windows的支持)而这样做的,那么这种方法将不起作用-您的方法会起作用-即只使用二进制名称,但您必须更改编译器安装位置的路径。如果您使用的是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()
参考:


在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()

为什么要投否决票?这和投票结果最高的答案完全一样,而且写得更早。@AnshumanDwibhashi:我很冷。我只是简单地评论一下投票礼仪,就这样。谢谢,快速补充问题。如何发送“cin>>a”正在读取的输入,例如在启动后?@ArniReynir:运行二进制文件后,所有输出都被捕获并存储在
p.communicate()
中。输出该信息的唯一方法是二进制文件本身。为什么?因为将捕获子进程输出,并且
p.communicate()
之后的任何输出都将与程序的输出不同步。将这些信息放在二进制文件中更容易、更好。
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()