【发布时间】: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