2010-01-13 43 views
2

我正在考慮將一些C代碼集成到一個Python系統(Django)中,我正在考慮使用Python/C API。另一種方法是與IPC進行兩個獨立的流程,但我首先關注直接交互。我對Python很陌生,所以我試圖感受一下正確的方向。Python C API和數據持久化在內存中?

是否有可能調用一個C初始化函數到一個內存塊(並放入一些內容),並返回一個句柄返回到Python腳本(指向內存塊的開始的指針)。在init函數返回後,分配的內存應該保留在堆上。然後Python腳本可以調用後續的C函數(作爲參數傳遞指向內存開始的指針),函數可以做一些思考並向Python腳本返回一個值。最後,還有另一個C函數來釋放內存。

假設應用程序是單線程的,並且在init函數之後,內存只讀,所以併發不是問題。內存量將是幾百兆字節。

  • 這甚至有可能嗎? Python會讓我從堆中取出malloc並允許它留在那裏嗎?它會來自Python進程的內存嗎? Python會嘗試並清除它(即它是否執行其自己的內存分配,並且不希望任何其他進程干擾其地址空間)?
  • 我可以只是將字節數組作爲Python管理的字符串(或類似的數據類型)返回,並將引用作爲參數傳遞迴C調用? Python可以用這麼大的字符串嗎?
  • 對於單獨的流程和IPC來說,我會做得更好嗎?

回答

1

你當然可以使用C API做你想做什麼。你將用C創建一個類,它可以保存任何想要的內存。如果你不想要的話,這個內存不必暴露給Python。

如果你很容易構建C DLL,並且不需要在C中執行Python操作,那麼ctypes可能是你最好的選擇。

+0

我不打算在Windows上工作,不知道這是否有所作爲。 – Joe 2010-01-13 20:10:57

+0

(看起來像是跨平臺) – Joe 2010-01-13 20:15:37

2
+0

謝謝。 FAQ說它沒有正式實現Python。對於在Cython上運行Django生產網站有點謹慎嗎? – Joe 2010-01-13 19:50:27

+2

這意味着它沒有實現源代碼發佈中語法文件給出的完整的Python語法。它仍然支持足夠有用,並且與用C語言編寫的模塊幾乎沒有區別,只是寫起來非常容易。 – 2010-01-13 19:53:48

+0

好的,我會研究它。 – Joe 2010-01-13 19:55:49