我似乎没有在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上运行我需要做些什么吗?
答案 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()
参考:
答案 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()