In official Doc. of Python 3, there is a short introduction to embedding Python in another application like C/C++ (seeEmbedding Python in Another Application).
The common procedure is as follows,
write prototype C/C++ code and Python module codes.
Note that in the Python codes conventions of python 2 & 3 can not be mixed together, which may cause segfault when running.
call.c
#includeint main(int argc, char *argv[]) { PyObject *pName, *pModule, *pDict, *pFunc; PyObject *pArgs, *pValue; int i; if (argc < 3) { fprintf(stderr,"Usage: call pythonfile funcname [args] "); return 1; } Py_Initialize(); pName = PyUnicode_FromString(argv[1]); /* Error checking of pName left out */ pModule = PyImport_Import(pName); Py_DECREF(pName); if (pModule != NULL) { pFunc = PyObject_GetAttrString(pModule, argv[2]); /* pFunc is a new reference */ if (pFunc && PyCallable_Check(pFunc)) { pArgs = PyTuple_New(argc - 3); for (i = 0; i < argc - 3; ++i) { pValue = PyLong_FromLong(atoi(argv[i + 3])); if (!pValue) { Py_DECREF(pArgs); Py_DECREF(pModule); fprintf(stderr, "Cannot convert argument "); return 1; } /* pValue reference stolen here: */ PyTuple_SetItem(pArgs, i, pValue); } pValue = PyObject_CallObject(pFunc, pArgs); Py_DECREF(pArgs); if (pValue != NULL) { printf("Result of call: %ld ", PyLong_AsLong(pValue)); Py_DECREF(pValue); } else { Py_DECREF(pFunc); Py_DECREF(pModule); PyErr_Print(); fprintf(stderr,"Call failed "); return 1; } } else { if (PyErr_Occurred()) PyErr_Print(); fprintf(stderr, "Cannot find function "%s" ", argv[2]); } Py_XDECREF(pFunc); Py_DECREF(pModule); } else { PyErr_Print(); fprintf(stderr, "Failed to load "%s" ", argv[1]); return 1; } Py_Finalize(); return 0; }
multiply.py
def multiply(a,b): print("Will compute", a, "times", b) c = 0 for i in range(0, a): c = c + b return c
For a single C code, just build like
g++ call.c -o call `python3-config --cflags` `python3-config --ldflags`
This can be written as a shell like build.sh.
3. To run the code, write a shell named run.sh,
PYTHONPATH=. ./call multiply multiply 3 2
Here call is the main code, the two multiplys are the module and function names, respectively.
When running, this code gives,
Will compute 3 times 2 Result of call: 6
Note if no PYTHONPATH=. statement in front of the run command, there will be errors like ImportError: No module named multiply.
Someone suggested to add into the .py file
import sys sys.path.insert(0, "./path/to/your/modules/")
I tested but not helpful.
BTW, the system path can be checked by
import sys print(sys.path)
Useful commands in Python 3 are:
PyObject *exc_type = NULL, *exc_value = NULL, *exc_tb = NULL; PyErr_Fetch(&exc_type, &exc_value, &exc_tb); PyObject* str_exc_type = PyObject_Repr(exc_type); //Now a unicode object PyObject* pyStr = PyUnicode_AsEncodedString(str_exc_type, "utf-8", "Error ~"); const char *strExcType = PyBytes_AS_STRING(pyStr); Py_XDECREF(str_exc_type); Py_XDECREF(pyStr); Py_XDECREF(exc_type); Py_XDECREF(exc_value); Py_XDECREF(exc_tb);
Other useful tutorials are
Python嵌入C/C++ (Python核心編程)
C++中嵌入Python調(diào)用
Embedding Python in C/C++: Part I
Embedding Python in C/C++: Part II
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/45388.html
摘要: Caching Libraries for caching data. Beaker - A library for caching and sessions for use with web applications and stand-alone Python scripts and applications. dogpile.cache - dogpile.cache...
摘要:漢字拼音 Awesome Python A curated list of awesome Python frameworks, libraries and software. Inspired by awesome-php. Awesome Python Environment Management Package Management Package Repositorie...
摘要:我們先看看的初始化函數(shù)的完整定義,看構(gòu)造一個模型可以輸入哪些參數(shù)我們可以將類的構(gòu)造函數(shù)中的參數(shù)分為以下幾組基礎(chǔ)參數(shù)我們訓(xùn)練的模型存放到指定的目錄中??赐昴P偷臉?gòu)造函數(shù)后,我們大概知道和端的模型各對應(yīng)什么樣的模型,模型需要輸入什么樣的參數(shù)。 Wide and deep 模型是 TensorFlow 在 2016 年 6 月左右發(fā)布的一類用于分類和回歸的模型,并應(yīng)用到了 Google Play ...
摘要:本項目使用網(wǎng)絡(luò)上收集的對聯(lián)數(shù)據(jù)集地址作為訓(xùn)練數(shù)據(jù),運(yùn)用注意力機(jī)制網(wǎng)絡(luò)完成了根據(jù)上聯(lián)對下聯(lián)的任務(wù)。這種方式在一定程度上降低了輸出對位置的敏感性。而機(jī)制正是為了彌補(bǔ)這一缺陷而設(shè)計的。該類中有兩個方法,分別在訓(xùn)練和預(yù)測時應(yīng)用。 桃符早易朱紅紙,楊柳輕搖翡翠群 ——FlyAI Couplets 體驗對對聯(lián)Demo: https://www.flyai.com/couplets s...
摘要:本項目使用網(wǎng)絡(luò)上收集的對聯(lián)數(shù)據(jù)集地址作為訓(xùn)練數(shù)據(jù),運(yùn)用注意力機(jī)制網(wǎng)絡(luò)完成了根據(jù)上聯(lián)對下聯(lián)的任務(wù)。這種方式在一定程度上降低了輸出對位置的敏感性。而機(jī)制正是為了彌補(bǔ)這一缺陷而設(shè)計的。該類中有兩個方法,分別在訓(xùn)練和預(yù)測時應(yīng)用。 桃符早易朱紅紙,楊柳輕搖翡翠群 ——FlyAI Couplets 體驗對對聯(lián)Demo: https://www.flyai.com/couplets s...