이것은 파이썬을 기계 코드로 컴파일하지 않습니다. 그러나 파이썬 코드를 호출하는 공유 라이브러리를 만들 수 있습니다.
찾고있는 것이 execp에 의존하지 않고 C에서 Python 코드를 실행하는 쉬운 방법입니다. Python embedding API 호출로 래핑 된 Python 코드에서 공유 라이브러리를 생성 할 수 있습니다. 응용 프로그램은 공유 라이브러리입니다. 다른 많은 라이브러리 / 응용 프로그램에서 사용할 수 있습니다.
다음은 C 프로그램과 링크 할 수있는 공유 라이브러리를 작성하는 간단한 예입니다. 공유 라이브러리는 Python 코드를 실행합니다.
실행될 파이썬 파일은 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
당신은 그것을 시도 할 수 있습니다 python2 -c "import pythoncalledfromc; pythoncalledfromc.main('HELLO')
. 출력됩니다 :
python is called from c
string sent by «c» code is:
HELLO
end of «c» code input
공유 라이브러리는 다음에 의해 다음과 같이 정의됩니다 callpython.h
.
#ifndef CALL_PYTHON
#define CALL_PYTHON
void callpython_init(void);
int callpython(char ** arguments);
void callpython_finalize(void);
#endif
관련 내용 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();
}
다음 명령으로 컴파일 할 수 있습니다.
gcc `python2.7-config --ldflags` `python2.7-config --cflags` callpython.c -lpython2.7 -shared -fPIC -o callpython.so
callpythonfromc.c
다음을 포함하는 이름의 파일을 작성하십시오 .
#include "callpython.h"
int main(void) {
char * example = "HELLO";
callpython_init();
callpython(&example);
callpython_finalize();
return 0;
}
컴파일하고 실행하십시오.
gcc callpythonfromc.c callpython.so -o callpythonfromc
PYTHONPATH=`pwd` LD_LIBRARY_PATH=`pwd` ./callpythonfromc
이것은 매우 기본적인 예입니다. 작동 할 수는 있지만 라이브러리에 따라 C 데이터 구조를 Python 및 Python에서 C로 직렬화하는 것이 여전히 어려울 수 있습니다. 상황이 다소 자동화 될 수 있습니다 ...
누 잇카 가 도움이 될 수 있습니다.
또한 numba가 있지만 둘 다 원하는 것을 정확하게 목표로하지는 않습니다. Python 코드에서 C 헤더 생성은 가능하지만 Python 유형을 C 유형으로 변환하는 방법을 지정하거나 해당 정보를 유추 할 수있는 경우에만 가능합니다. Python ast analyzer는 python astroid 를 참조하십시오 .