এটি পাইথনকে মেশিন কোডে সংকলন করে না। তবে পাইথন কোডটি কল করতে একটি ভাগ করা লাইব্রেরি তৈরি করতে দেয়।
আপনি যা সন্ধান করছেন তা যদি এক্স এক্সপ্যাক্ট স্টাফের উপর নির্ভর না করে সি থেকে পাইথন কোড চালানোর সহজ উপায়। পাইথন এম্বেডিং এপিআইতে কয়েকটি কল দিয়ে মোড়ানো পাইথন কোড থেকে আপনি একটি ভাগ করে নেওয়া গ্রন্থাগার তৈরি করতে পারেন । ঠিক আছে অ্যাপ্লিকেশনটি একটি শেয়ার্ড লাইব্রেরি, একটি। সুতরাং যা আপনি অন্যান্য অনেক লাইব্রেরি / অ্যাপ্লিকেশনগুলিতে ব্যবহার করতে পারেন।
এখানে একটি সাধারণ উদাহরণ যা একটি ভাগ করা লাইব্রেরি তৈরি করে, যা আপনি একটি সি প্রোগ্রামের সাথে লিঙ্ক করতে পারেন। ভাগ করা লাইব্রেরি পাইথন কোড চালায়।
যে অজগর ফাইলটি কার্যকর করা হবে তা হ'ল 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
এটি একটি খুব মৌলিক উদাহরণ। এটি কাজ করতে পারে তবে লাইব্রেরির উপর নির্ভর করে পাইথন এবং পাইথন থেকে সি পর্যন্ত সি তথ্য কাঠামোগুলি সিরিয়ালায়িত করা এখনও কঠিন হতে পারে কিছু কিছু স্বয়ংক্রিয়ভাবে ...
নুইটকা সহায়ক হতে পারে।
এছাড়াও নাম্বা রয়েছে তবে তারা দুজনেই ঠিক যা করতে চান তা করার লক্ষ্য রাখে না। পাইথন কোড থেকে সি হেডার তৈরি করা সম্ভব তবে আপনি যদি পাইথন প্রকারকে সি প্রকারে রূপান্তর করতে চান বা সেই তথ্যটি নির্ধারণ করতে পারেন তবেই। পাইথন অ্যাস্ট বিশ্লেষকের জন্য পাইথন অ্যাস্ট্রয়েড দেখুন ।