2016-03-06 112 views
0

我正在用C代碼接收數據,目前我唯一能做的就是在屏幕上打印數據。我想知道,如果有可能不僅僅是將數據打印在屏幕上,將數據發送到正在運行的Python代碼是否可以進一步處理數據是可行的?數據是以數組形式存在的。將在屏幕上打印數據的設備將運行Python代碼。將正在運行的C代碼中的數據鏈接到正在運行的Python代碼

我這樣做是爲了避免將數據保存在文件中,然後從我的python腳本訪問文件,這將增加我的時間依賴系統的延遲。

C代碼運行在一個低處理器上,它只是能夠接收數據而沒有任何處理。

(編輯),我的意思的演示已經包含:

C面:

// code that receives the data periodically as an array 
// when received do 
printf(" x = %d y = %d z = %d ", data[0],data[1],data[2]); 
// what I am looking for is something like this 
sendtoPy("filename.py",data) 
// repeat 

Python端:

# this code just sits to wait for anything coming from C 
# wait for any code to be received from datafromCexample.c 
def waitforC("datafromCexample.c",data): 
     print "data has been received" 
     # process the data received into a list 
     # further processing 
waitforC(data) 

當然,這是演示只是原始代碼。如果我在演示中犯了錯誤,請教我並糾正我,我只想學習。如果這不可用,請您提供可在此情況下使用的備選方案嗎?

謝謝。

+0

Python是一種編程,而不僅僅是一種腳本語言。 – Olaf

+0

@ das-g哦忘了解決這個問題。屏幕上印有數據的設備將運行python代碼。 –

+0

@Olaf固定。謝謝。 –

回答

1

,我會用Cython包裹,你有計劃的部分C。你可以閱讀關於here的完整教程。您也可以使用Cython加速代碼的python部分。

2

如果C程序和Python程序/腳本可以在同一設備上運行,你有幾種選擇:

  • 讓C代碼輸出在標準輸出的數據(這也許正是它已經在做),將其管理到Python程序並讓Python程序讀入標準輸入。
  • 讓C代碼輸出在標準輸出的數據,並從你的Python代碼(例如,用subprocess.check_output調用C程序中,處理所產生的輸出。
  • 在C代碼,有一個功能,將按塊返回數據塊(每個調用一個塊,其中「塊」是您可以輕鬆生成和處理的數量)使用Cyton(請參閱Tony's answer)或CFFI或任何other available ways可以從Python重複調用它到獲取要處理的數據
  • 編寫一個Python腳本,該腳本可以用一塊數據調用並處理它。從您的C代碼中獲取大量數據,並使用系統調用來調用它。
  • 使用Cyton從C調用python函數。

根據不同的操作系統上,你可以得到更豐富的使用命名管道,插座,總線消息和諸如此類的東西,但上面的選項可能已經夠多了選擇,並應滿足大多數使用情況。選擇哪一個取決於數據的性質和想要處理的數據的性質,以及一些非功能性要求(例如,如果其中一個過程正在停滯......),所以一般不能回答。

在評論這個回答,you inquire

我找去的第一個選項[…。如果你能向我推薦一個可以很好地處理數組的程序庫或程序,我將不勝感激。

and

對於C側,我將需要庫,通過它,我將管中的數據到Python代碼。在Python方面,我想我需要使用多線程,這將允許我永遠運行(預測任何傳入的數據)2-接收來自C代碼的傳入數據,因此一個庫將能夠這樣做

管道的美妙之處在於所涉及的進程在大多數編程語言中不需要任何特殊的庫。這些過程只是做一些幾乎每一種通用編程語言都可以(或多或少)簡單的方式:從標準輸入讀取和/或寫入標準輸出。這也是命令行應用程序在讀取鍵盤上輸入的內容和/或將文本打印到(今天經常是虛擬的)終端(又名文本控制檯)時所做的。

將一個進程的輸出轉發到另一個進程的輸入(就像用戶正在讀取第一個進程打印的內容並將其輸入到第二個進程中一樣)是操作系統的任務,因此進程不必擔心這一點。第一個過程只需輸出第二個過程可以理解的格式。

例如,unix命令ls將列出當前工作目錄中的文件和目錄。我們假設它每行打印一個名字。 unix命令shuf從標準輸入中讀取行,直到它檢測到文件結束符,然後以隨機順序打印它們。 (它打亂他們。)

您可以在一個shell調用shufHello World!(如shbash),然後鍵入[Enter]鍵I like shuffled text. [Enter]鍵Do you, too? [Enter]鍵No? What a pity. [確定] [按Ctrl + d],並可能會等的輸出:

Do you, too? 
Hello World! 
No? What a pity. 
I like shuffled text. 

如果要列出當前工作目錄中的文件和目錄,但在比ls返回不同的隨機順序,你可以管的ls通過shuf輸出。例如。在shbash

ls | shuf 

將採取的ls輸出,並將其轉發到shuf原樣如果它被手動鍵入英寸(只能比你輸入的快得多。)

因此,如果你的C程序在終端上產生了機器可分析的輸出(這可能已經是這種情況;你可能希望在你的問題中包含一個當前終端輸出的例子),你可以將它轉發給會爲您的Python程序一樣

./binary_of_your_c_program | python ./your_python_script.py 

你的Python程序,然後只是有read from standard input和過程,但是你希望它是什麼到達那裏。讀取標準輸入的大多數直接方法將遍歷接收到的所有行,直到出現文件結束或者它們收到終止進程的信號,所以保持永久運行的python腳本不會太難。 (除非您也在意在意外終止時自動重新啓動,例如由於運行時錯誤)。

+0

謝謝先生。這正是我想要的。我不知道有多少方法可以做到這一點誠實(小白)。我期待與第一個選項,因爲它似乎是最適合我的想法(這是C代碼將能夠轉儲數據到Python代碼直接不會導致同步問題)。在你的幫助下,現在我知道在哪裏進一步搜索。如果你能向我推薦一個可以很好地處理數組的程序庫或程序,我將不勝感激。 –

+1

「可以在數組中使用的庫或過程」適用於Python或C端? –

+0

對於C端來說,我需要通過它的庫來將數據傳輸到Python代碼。在Python方面,我想我需要使用多線程,這將允許我永遠運行(預測任何傳入的數據)2-接收來自C代碼的傳入數據,因此一個庫將能夠這樣做 –