【问题标题】:subprocess not receiving output子进程没有收到输出
【发布时间】:2021-09-03 18:39:42
【问题描述】:
import numpy as np
import pandas as pd    
import subprocess

df = pd.DataFrame(np.random.normal(size = 1000).reshape(100,10))
    
exe =  r"C:\Users\Snake91\source\repos\ConsoleApplication1\Debug\ConsoleApplication1.exe "

process = subprocess.Popen([exe],
                           stdin =  subprocess.PIPE,
                      stdout = subprocess.PIPE,
                     stderr=subprocess.PIPE, shell = True)
stdout, stderr = process.communicate(np.array(df).tobytes())

在可执行文件的代码下方

#include <iostream>

int main(int argc, char* argv[])
{
    int size = sizeof(argv)/sizeof(argv[0]) + 1;
    if (size > 1)
    {
        for (int idx = 1; idx < size; idx++)
        {
            std::cout << argv[idx];
        }
    }
}

但是,当运行 python 脚本时,我得到一个空字节字符串,而不是序列化的数据帧。我哪里错了?

【问题讨论】:

  • argv 不接收 CLI 参数?在communicate 中传递它们时,可以将它们发送到std::cin
  • 添加另一个std::cout,它总是输出一些东西,你可能会看到 Python 会收到那个输出。没有读取输入的是 C++ 程序 - 如上所述,communicate 的参数被发送到进程的标准输入,因此您需要使用类似std::cin 的内容来读取它。 argv 包含命令行参数,所以如果你的命令是[exe, "arg1"],你的子进程将打印arg1。此外,argc 包含传递给程序的参数数量(+1,因为 #0 是可执行文件的路径),因此您不需要 sizeof 魔法。
  • @azro 我已经尝试了好几个小时...谢谢!
  • @Czaporka 谢谢你,实际上使用[exe, "arg1"] 我得到了一个我无法以任何方式解决的UnicodeError,这就是我切换到communicate 的原因。我实际上不知道 在哪里 communicate 正在传递参数。谢谢

标签: python subprocess popen


【解决方案1】:

正如 cmets 中正确指出的那样,communicate 确实将参数传递给命令行,而是通过 std::cin。必须通过以下方式修改可执行文件的代码才能使其工作。

#include <string>
#include <iostream>

using namespace std;
int main(int argc, char* argv[])
{
    std::string line;
    while (getline(std::cin, line))
    {
        std::cout << line << std::endl;
    }

}

感谢您的帮助。

【讨论】:

    猜你喜欢
    • 2019-12-03
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多