यह पायथन को मशीन कोड के लिए संकलित नहीं करता है। लेकिन पायथन कोड को कॉल करने के लिए एक साझा लाइब्रेरी बनाने की अनुमति देता है।
यदि आप जिस चीज की तलाश कर रहे हैं, वह निष्पादित सामान पर भरोसा किए बिना सी से पायथन कोड को चलाने का एक आसान तरीका है। आप अजगर कोड एम्बेडिंग एपीआई के लिए कुछ कॉल के साथ लिपटे अजगर कोड से एक साझा पुस्तकालय उत्पन्न कर सकता है । वैसे एप्लिकेशन एक साझा पुस्तकालय है, एक .so जिसे आप कई अन्य पुस्तकालयों / अनुप्रयोगों में उपयोग कर सकते हैं।
यहां एक सरल उदाहरण है जो एक साझा पुस्तकालय बनाता है, जिसे आप सी कार्यक्रम के साथ जोड़ सकते हैं। साझा पुस्तकालय पायथन कोड निष्पादित करता है।
अजगर फ़ाइल को निष्पादित किया जाएगा 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
यह बहुत बुनियादी उदाहरण है। यह काम कर सकता है, लेकिन लाइब्रेरी पर निर्भर करता है कि अभी भी अजगर के लिए सी डेटा संरचनाओं को क्रमबद्ध करना मुश्किल हो सकता है और पायथन से लेकर सी। चीजें कुछ हद तक स्वचालित हो सकती हैं ...
Nuitka सहायक हो सकता है।
इसके अलावा सुंबा है, लेकिन वे दोनों जो आप चाहते हैं वह करने का लक्ष्य नहीं रखते हैं। पायथन कोड से C हेडर बनाना संभव है, लेकिन केवल तभी जब आप निर्दिष्ट करें कि पायथन प्रकारों को C प्रकारों में कैसे परिवर्तित किया जाए या उस जानकारी का अनुमान लगाया जा सकता है। अजगर खगोल विज्ञानी के लिए अजगर एस्ट्रोइड देखें ।