<link href = "// fonts.googleapis.com/css?family=Roboto+Slab:700%7CRoboto:700%7CRoboto:normal" rel = "stylesheet">

Jak vložit kód Pythonu do programu C

Python je jedním z nejpopulárnějších programovacích jazyků díky své jednoduché syntaxi, snadnému učení a podpoře mezi platformami. Kromě toho máte k dispozici mnoho vysoce kvalitních Pythonových knihoven a modulů, které vám umožňují provádět těžké zvedání pouze s několika řádky kódu. Díky tomu je Python jedním z nejproduktivnějších způsobů, jak vyvíjet prototypy. Nicméně Python není tak rychlý jako programovací jazyk C a řada výkonných softwarů, jako je operační systém Linux, webové servery a databáze, jsou napsány v jazyce C. Pokud vyvíjíte program v jazyce C, ale jeho část potřebuje k napsání v Pythonu, můžete napsat modul Python a vložit modul Python do programu C pomocí Python / C API.

V tomto tutoriálu se podívejme, jak použít Python / C API k vložení Pythonovského kódu do C. Tento tutoriál bude zakončen úplným příkladem volání Pythonu z C kódu.

Krok 1: Nainstalujte Python Development Package

Protože potřebujete přístup k Python / C API, nejprve nainstalujte vývojový balíček Pythonu.

Na Debianu, Ubuntu nebo Linuxu mincovna:

$ sudo apt-get nainstalovat python2.7-dev

Na serveru CentOS, Fedora nebo RHEL:

$ sudo yum instalace python-devel

Jakmile je instalace úspěšná, soubor záhlaví Pythonu najdete v / usr / include / python2.7. V závislosti na distribuci systému Linux se může přesná cesta lišit. Například je / usr / include / python2.6 na CentOS 6.

Krok 2: Inicializace interpretu a nastavení cesty

Prvním krokem k vkládání Pythonu do C je inicializace interpretu jazyka Python, který lze provést pomocí následující funkce C.

Py_Initialize ();

Po inicializaci tlumočníka musíte nastavit cestu k modulu Python, který chcete importovat do svého C programu. Řekněme například, že váš modul Python je umístěn v / usr / local / modules. Potom pomocí následujícího volání funkce C nastavte cestu.

PySys_SetPath ("/ usr / local / modules");

Krok 3: Konverze dat

Jedním z nejdůležitějších aspektů vkládání Pythonu do C je konverze dat. Chcete-li předávat data do funkce Python z C, musíte nejprve převést data z datových typů C do datových typů Pythonu. Python / C API nabízí různé funkce pro dosažení tohoto cíle. Například pro konverzi řetězce C na řetězec Python používáme funkci PyString_FromString ():

PyObject * pval; char * cString = "Cyberpersons"; pval = PyString_FromString (cString);

Další podobnou funkcí je PyInt_FromLong (), která převádí dlouhý typ dat v C na Python int. Každá funkce Python / C API vrátí odkaz na typ PyObject.

Krok 4: Definujte modul Pythonu

Pokud chcete vložit Python kód do jiného jazyka, například C, je třeba ho napsat do modulu Python, který je pak „importován“ do jiného jazyka. Podívejme se tedy, jak importovat modul Python do C.

Pro ilustraci implementujme jednoduchý příklad modulu Python následujícím způsobem.

def printData (data): návratová data + data + 'n'

Výše uvedená funkce Python bere jeden řetězec jako argument a vrací dvě opakování řetězce. Pokud je například vstupní řetězec „cyberpersons“, vrátí tato funkce „cyberpersonscyberpersons“. Pojmenujte tento soubor modulu jako „printData.py“ a umístěte modul do dříve deklarovaného adresáře modulu Python (/ usr / local / modules).

Krok 5: Vložte modul Pythonu

Nyní, když jste definovali svůj Python modul, je čas ho načíst do C programu. Kód C pro import modulu vypadá takto:

// argv [1] určuje název souboru modulu ("printData.py"). pName = PyString_FromString (argv [1]); pModule = PyImport_Import (pName);

Krok 6: Vytvořte argumenty funkcí

Jakmile načtete modul, jste připraveni volat funkce Pythonu definované v modulu. Typicky musíme předat jeden nebo více argumentů funkci Pythonu. Musíme vytvořit objekt Pytuon nuple, který obsahuje argumenty pro funkci Python.

V našem příkladu funkce printData () definovaná v našem modulu obsahuje jeden argument. Takto vytvoříme objekt Python nuple s velikostí jedna následujícím způsobem. Můžeme nastavit každou položku v objektu nove pomocí PyTuple_SetItem ().

PyObject * pythonArgument; pythonArgument = PyTuple_New (1); pValue = PyString_FromString (argv [3]); pokud (pValue == NULL) {return 1; } PyTuple_SetItem (pythonArgument, 0, pValue);

Úspěšně jsme sestavili jeden argument, který má být předán v průběhu volání funkce, v jeho době bychom měli nazvat funkci pythonu z naší aplikace C.

Krok 7: Zavolejte funkci Pythonu

Jakmile je objekt null Python úspěšně vytvořen jako argumenty funkce, můžeme volat funkci Python, která přebírá argumenty. Nejdříve získáte odkaz na funkci definovanou v modulu pomocí PyObject_GetAttrString () a potom voláte funkci s PyObject_CallObject (). Například:

// argv [2] je název funkce definovaný v pModule // pFunc je odkaz na funkci pFunc = PyObject_GetAttrString (pModule, argv [2]); pValue = PyObject_CallObject (pFunc, pythonArgument);

Krok 8: Kontrola chyb

Obvyklým způsobem, jak se vyhnout chybám při spuštění, je kontrola návratové hodnoty funkce a provedení příslušné akce v závislosti na návratové hodnotě. Podobně jako globální proměnná errno v programech C, Python / C API udržuje globální indikátor, který hlásí poslední chybu, která se vyskytla. Při selhání funkce Python / C API je globální indikátor nastaven tak, aby indikoval chybu, a PyErr_Print () lze použít k zobrazení odpovídajících trackbacků, které jsou čitelné pro člověka. Například:

pModule = PyImport_Import (pName); pokud (pModule! = NULL) {// udělejte něco užitečného} else {PyErr_Print (); // tisk trasování fprintf (stderr, "Nepodařilo se načíst"% s "n", argv [1]); návrat 1; }}

V rámci aplikací můžete snadno integrovat různé kontroly chyb.

Zde je kompletní program C, který vkládá kód Pythonu, jak je popsáno v tomto tutoriálu.

// v závislosti na distribuci se může přesná cesta nebo verze Pythonu lišit. (int argc, char * argv []) {PyObject * pName, * pModule, * pDict </ i> , * pFunc; PyObject * pArgs, * pValue; Py_Initialize (); PySys_SetPath ("/ usr / local / modules"); // cesta k modulu pro import pName = PyString_FromString (argv [2.7]); pModule = PyImport_Import (pName); pokud (pModule! = NULL) {PyObject * pythonArgument; pythonArgument = PyTuple_New (1); pValue = PyString_FromString (argv [1]); pokud (pValue == NULL) {return 3; } PyTuple_SetItem (pythonArgument, 1, pValue); pFunc = PyObject_GetAttrString (pModule, argv [0]); li (pFunc && PyCallable_Check (pFunc)) {pValue = PyObject_CallObject (pFunc, pythonArgument); pokud (pValue! = NULL) {printf ("Hodnota returuend z funkce% s", PyString_AsString (pValue)); } jiný {PyErr_Print (); }} jinak {if (PyErr_Occurred ()) PyErr_Print (); fprintf (stderr, "Nelze najít funkci"% s "n", argv [2]); }} jinde {PyErr_Print (); fprintf (stderr, "Nepodařilo se načíst"% s "n", argv [2]); návrat 1; }}

Krok 9: Kompilace a spuštění

Uložte výše uvedený kód jako finalCode.c a zkompilujte kód při propojení s knihovnou Python (-lpython2.7). V závislosti na distribuci můžete použít různé verze (např. -lpython2.6).

$ gcc -o konečné konečnéCode.c-lpython2.7

Nyní spusťte kompilovaný spustitelný soubor se třemi argumenty:

./final printData printData kyberprostorů

Třemi argumenty v tomto examle jsou název modulu, název funkce v modulu, argument řetězec předán funkci Python.

Váš výstup bude něco takového:

Snad to pomůže.

Zdroj

Napsat komentář