Bu, Python'u makine koduna derlemez. Ancak Python kodunu çağırmak için paylaşılan bir kitaplık oluşturmaya izin verir.
Eğer aradığınız şey Python kodunu C'den çalıştırmanın kolay bir yoluysa, execp maddelerine güvenmeden. Python gömme API'sine yapılan birkaç çağrı ile sarmalanmış python kodundan paylaşılan bir kitaplık oluşturabilirsiniz . Uygulama, diğer birçok kitaplıkta / uygulamada kullanabileceğiniz bir paylaşılan kitaplıktır.
Burada, bir C programına bağlayabileceğiniz, paylaşılan bir kitaplık oluşturan basit bir örnek var. Paylaşılan kitaplık Python kodunu yürütür.
Çalıştırılacak python dosyası pythoncalledfromc.py
:
# -*- encoding:utf-8 -*-
# this file must be named "pythoncalledfrom.py"
def main(string): # args must a string
print "python is called from c"
print "string sent by «c» code is:"
print string
print "end of «c» code input"
return 0xc0c4 # return something
İle deneyebilirsiniz python2 -c "import pythoncalledfromc; pythoncalledfromc.main('HELLO')
. Çıktı:
python is called from c
string sent by «c» code is:
HELLO
end of «c» code input
Paylaşılan kitaplık aşağıdakiler tarafından tanımlanacaktır callpython.h
:
#ifndef CALL_PYTHON
#define CALL_PYTHON
void callpython_init(void);
int callpython(char ** arguments);
void callpython_finalize(void);
#endif
İlişkili callpython.c
:
// gcc `python2.7-config --ldflags` `python2.7-config --cflags` callpython.c -lpython2.7 -shared -fPIC -o callpython.so
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <python2.7/Python.h>
#include "callpython.h"
#define PYTHON_EXEC_STRING_LENGTH 52
#define PYTHON_EXEC_STRING "import pythoncalledfromc; pythoncalledfromc.main(\"%s\")"
void callpython_init(void) {
Py_Initialize();
}
int callpython(char ** arguments) {
int arguments_string_size = (int) strlen(*arguments);
char * python_script_to_execute = malloc(arguments_string_size + PYTHON_EXEC_STRING_LENGTH);
PyObject *__main__, *locals;
PyObject * result = NULL;
if (python_script_to_execute == NULL)
return -1;
__main__ = PyImport_AddModule("__main__");
if (__main__ == NULL)
return -1;
locals = PyModule_GetDict(__main__);
sprintf(python_script_to_execute, PYTHON_EXEC_STRING, *arguments);
result = PyRun_String(python_script_to_execute, Py_file_input, locals, locals);
if(result == NULL)
return -1;
return 0;
}
void callpython_finalize(void) {
Py_Finalize();
}
Aşağıdaki komutla derleyebilirsiniz:
gcc `python2.7-config --ldflags` `python2.7-config --cflags` callpython.c -lpython2.7 -shared -fPIC -o callpython.so
callpythonfromc.c
Aşağıdakileri içeren bir dosya oluşturun :
#include "callpython.h"
int main(void) {
char * example = "HELLO";
callpython_init();
callpython(&example);
callpython_finalize();
return 0;
}
Derleyin ve çalıştırın:
gcc callpythonfromc.c callpython.so -o callpythonfromc
PYTHONPATH=`pwd` LD_LIBRARY_PATH=`pwd` ./callpythonfromc
Bu çok basit bir örnek. Çalışabilir, ancak kitaplığa bağlı olarak C veri yapılarını Python'a ve Python'dan C'ye serileştirmek yine de zor olabilir. İşler bir şekilde otomatikleştirilebilir ...
Nuitka yardımcı olabilir.
Ayrıca numba var ama ikisi de tam olarak istediğiniz şeyi yapmayı hedeflemiyor. Python kodundan bir C başlığı oluşturmak mümkündür, ancak yalnızca Python türlerinin C türlerine nasıl dönüştürüleceğini belirtirseniz veya bu bilgileri çıkarabilirseniz. Bir Python ast analizörü için python astroid'e bakın .