簡體   English   中英

從C程序中調用Python函數

[英]Call a Python function from within a C program

我在C中有一個應用程序,在某些時候我需要解決非線性優化問題。 不幸的是,AFAIK在C中的資源非常有限(請讓我知道其他情況)。 但是在Python中使用它很簡單,例如scipy.optimize.minimize

當我試圖這樣做時,我遇到了一些看起來非常頻繁的陷阱,例如找不到Python.h ,模塊沒有加載,函數調用時出現分段錯誤等。

什么是快速簡便的第一計時器鏈接這兩個程序的方式?

為了使這項工作有一些你必須確保到位的東西:

  1. 確保安裝了Python(您可能需要python-dev包)。
  2. 找到你的Python.h文件,例如locate Python.h 其中一個應該出現在include文件夾的sub(sub)文件夾中,例如路徑應該是../include/python2.7/Python.h
  3. 在C代碼中插入#include “<path_to_Python.h>"以便能夠使用Python API。
  4. 使用任何教程來調用Python函數。 我用過這個 ,它就是訣竅。 然而,有幾個小點缺失:

    • 無論何時使用任何Py<Name>函數,例如PyImport_Import()總是檢查結果以確保沒有錯誤,例如

       // Load the module object pModule = PyImport_Import(pName); if (!pModule) { PyErr_Print(); printf("ERROR in pModule\\n"); exit(1); } 
    • 初始化Python解釋器之后,即在Py_Initialize(); ,你必須將當前路徑附加到sys.path以便能夠加載你的模塊(假設它位於你當前的目錄中):

       PyObject *sys = PyImport_ImportModule("sys"); PyObject *path = PyObject_GetAttrString(sys, "path"); PyList_Append(path, PyString_FromString(".")); 
  5. 請記住,當您提供Python文件的名稱時,它必須沒有擴展名.py
  6. 最后,在編譯/鏈接期間必須執行以下操作:
    • 還記得以前用過的../include/python2.7/Python.h文件嗎? 在編譯期間在gcc選項中使用-I選項在頭文件目錄列表中包含include文件夾,例如-I /System/Library/Frameworks/Python.framework/Versions/2.7/include
    • 還將具有所需庫的文件夾傳遞給鏈接器。 它應該位於include文件夾所在的同一文件夾中,例如-L /System/Library/Frameworks/Python.framework/Versions/2.7/lib ,以及-lpython2.7選項(當然會相應地調整它) Python版)。

現在你必須能夠成功編譯和執行你的C程序,並在其中調用你的Python程序。

我希望這是有益的,祝你好運!

資料來源:

暫無
暫無

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

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