2017-06-14 45 views
2

我在用C++和python編寫的程序之間傳遞數據。我可以通過其命令行參數將多少數據傳遞給C++程序?

我發現要做到這一點最簡單的方法之一是編譯C++程序,然後只是把它使用subprocess.call('cprog.exe arg1 arg2', shell=True)蟒蛇,並通過這避免使用用Cython參數arg1, arg2.... etc

的數據傳輸,提升...等......我發現在windows上工作是一個巨大的痛苦。特別是在未連接到互聯網的老化服務器上​​。 (請不要回復這個帖子,試圖幫助cython或boost等 - 我想限制討論主要問題。)

我的問題是:這種方法的侷限性是什麼?

我可以對整個數據數組進行連續化/編碼/解碼並通過命令行參數以這種方式傳遞它們嗎?那幾千兆字節的文件呢?

這會比寫入硬盤驅動器,然後讀取硬盤驅動器更快嗎?


編輯:看來,這是相關的: Maximum Length of Command Line String

+2

C++語言規範未指定傳遞給'main()'的命令行參數的最大大小。實際限制完全取決於您的操作系統。 –

+1

這取決於你的操作系統limnit在哪裏,但會有一個。將數據傳遞到子級的通常方法是使用stdin。 – 2017-06-14 12:29:44

+0

根據你的迴應我改變了我的搜索條件,發現這個: https://stackoverflow.com/questions/3205027/maximum-length-of-command-line-string 我認爲這包含答案!謝謝 – Ben

回答

0

的主要簽名是

int main(int argc, const char** argv) 

因此你被argv的大小的限制,並不會保證的廣告是能夠傳遞超過32767個參數。根據您的操作系統和機器,您可能會遇到其他限制,但這是內置於該語言中的限制。

請注意,對於任何給定的編譯器,可能會有更大的int大小,並且可能能夠支持更多的參數,但它不受標準保證。

+1

A)參數向後B)爲什麼2147483647? – NathanOliver

+0

A)哎喲 - 語義無論如何;) 乙)int有一個明確的範圍 - 或者你說argc可能是負面的?有趣的 – UKMonkey

+0

@NathanOliver如果我們假設'int'是32位,那麼argc的最大值將是2147483647. – CodingHero

1

不是一個完整的答案(我不能對任何硬限制評論),但要記住,你通過在命令行上的所有數據將在內存,以適應,而據我所知是沒有在這個過程中釋放這個內存的方法......所以這不是分享千兆字節數據的實際方法。

在使用shell=True時,您構建的命令將由shell解釋,它可能(將)會對接受的參數數量以及參數的大小施加一系列限制。它也可能會限制參數總共消耗多少內存。 說明你的操作系統/ shell可能很有趣,以便其他人可以投入 - 我懷疑Windows和cmd.exe由於你的標籤,但不能確定!


這是一個壞主意一般,和(雖然它不是一個回答你的問題),你應該認真看看使用管道的進程間通信(IPC)。這將消除您的編碼/解碼開銷,任何關於大小限制的問題,以及將數據寫入磁盤的任何問題。

+0

太好了 - 謝謝!我現在將研究使用管道。 – Ben

相關問題