【问题标题】:Compile c++ with subproccess使用子进程编译 c++
【发布时间】:2013-08-11 12:20:34
【问题描述】:

我似乎没有通过在 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 上运行吗?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

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

    ('', '')
    

    由于您使用的是 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()
    

    参考:

    Python subprocess output on windows?

    【讨论】:

    • 为什么投反对票?它与投票率最高的答案完全相同并且是之前写的。
    • @AnshumanDwibhashi:我很冷。我只是在评论投票礼仪,仅此而已。
    • 谢谢,快速补充问题。例如,如何在开始后发送“cin >> a”正在读取的输入?
    • @ArniReynir:二进制文件运行后,所有输出都被捕获并存储在p.communicate()中。输出该信息的唯一方法将是二进制本身。为什么?因为子进程输出将被捕获,p.communicate() 之后的任何输出都将与程序的输出不同步。将这些信息放入二进制文件更容易更好。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多