簡體   English   中英

一個非常簡單的python subprocess.Popen任務帶來的無盡問題

[英]Endless problems with a very simple python subprocess.Popen task

我希望python將大約50萬個整數(范圍在0-255之間)發送給用C ++編寫的可執行文件。 然后,該可執行文件將以幾千個整數響應。 每一行。 看起來子過程應該很簡單,但是我遇到了無數麻煩。 現在用代碼進行即時測試:

// main()
u32 num;
std::cin >> num;

u8* data = new u8[num];
for (u32 i = 0; i < num; ++i)
    std::cin >> data[i];

// test output / spit it back out
for (u32 i = 0; i < num; ++i)
    std::cout << data[i] << std::endl;

return 0;

在python中構建一個字符串數組(“數據”),每個字符串都類似於“ 255 \\ n”,然后使用:

output = proc.communicate("".join(data))[0]

...不起作用(例如stdin已關閉,一次可能太多)。 使用proc.stdin和proc.stdout都不起作用。 這應該非常簡單,但是我不斷遇到異常,並且/或者沒有輸出數據返回給我。 我的Popen當前是:

proc = Popen('aux/test_cpp_program', stdin=PIPE, stdout=PIPE, bufsize=1)

在我拔頭發之前先給我建議。 ;)

這對我來說非常合適:

#include <iostream>

int main()
{
    int num;
    std::cin >> num;

    char* data = new char[num];
    for (int i = 0; i < num; ++i)
        std::cin >> data[i];

    // test output / spit it back out
    for (int i = 0; i < num; ++i)
        std::cout << data[i] << std::endl;

    return 0;
}

蟒蛇:

In [9]: from subprocess import Popen, PIPE
In [10]: a = Popen('./a.out', stdin=PIPE, stdout=PIPE)
In [11]: a.stdin.write("2\nab")
In [12]: a.stdout.read()
Out[12]: 'a\nb\n'

請注意,我在要寫入的字節數之間添加了一個定界符(\\ n),這是最安全的,如果您不希望c ++ cin在發送諸如3、1、2、3之類的東西時會失敗,它們會連接到3123,期望這么多爭論。

在C ++中,當您從cin讀取charunsigned char時,它將從stdin讀取單個字節。 但是,您希望它讀取從0到255的數字的十進制表示形式。如果您讀取一個int則它應該正確讀取它:

unsigned int n;
std::cin >> n;
data[i] = static_cast<u8>(n);

或者,您可以使用chr函數讓Python代碼將值以字節而不是數字的順序寫入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM