2

我似乎没有从在 mac 上运行编译文件获得输出,但由于某种原因它可以在 windows 上运行。

测试.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 上运行吗?

4

2 回答 2

2

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

('', '')

由于您使用的是 POSIX 系统,即 Mac,因此您尝试在生成的二进制文件前未指定“./”的情况下执行二进制文件test。因此,您的命令实际上应该是:

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

这应该给你:

('Hello world\n', '')

正如预期的那样。

另一件需要注意的事情是,如果您已将二进制文件的位置添加到$PATHshell 变量中,则无需键入./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()

参考:

Windows上的Python子进程输出?

于 2013-08-11T12:22:47.437 回答
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()
于 2013-08-11T12:48:15.980 回答