2012-03-21 18 views
8

मैं एक सी/सी ++ एप्लिकेशन में पायथन को एम्बेड कर रहा हूं जिसमें एक परिभाषित एपीआई होगा।एंबेडेड पायथन 2.7.2 उपयोगकर्ता द्वारा परिभाषित निर्देशिका से मॉड्यूल आयात करना

class userscript1: 
    def __init__(self): 
     ##do something here... 

    def method1(self): 
     ## method that can be called by the C/C++ app...etc 

मैं (-का-प्रमाण अवधारणा के लिए) अतीत में प्रबंधित किया है इस का उपयोग किया जाता करने के लिए:

आवेदन जो मोटे तौर पर इस तरह संरचित कर रहे एक स्क्रिप्ट में परिभाषित कक्षाएं, दृष्टांत करने की जरूरत है कोड की निम्न प्रकार:

PyObject* pName = PyString_FromString("userscript.py"); 
PyObject* pModule = PyImport_Import(pName); 
PyObject* pDict = PyModule_GetDict(pModule); 
PyObject* pClass = PyDict_GetItemString(pDict, "userscript"); 
PyObject* scriptHandle = PyObject_CallObject(pClass, NULL); 

अब जब कि मैं एक उत्पादन वातावरण के अधिक में हूँ, इस PyImport_Import लाइन में विफल हो रहा है - मुझे लगता है कि इस वजह से मैं स्क्रिप्ट के लिए एक निर्देशिका पहले जोड़ें करने के लिए कोशिश कर रहा हूँ हो सकता है नाम, उदाहरण के लिए

PyObject* pName = PyString_FromString("E:\\scriptlocation\\userscript.py"); 

अब, तुम मैं क्या कोशिश की है की एक विचार देने के लिए, मैं इन कॉल के सभी से पहले सिस्टम पथ को संशोधित करने के लिए यह इस मॉड्यूल के लिए खोज करने की कोशिश की। मूल रूप से संशोधित sys.path प्रोग्राम के रूप में करने की कोशिश की:

PyObject* sysPath = PySys_GetObject("path"); 
PyObject* path = PyString_FromString(scriptDirectoryName); 
int result = PyList_Insert(sysPath, 0, path); 

ये लाइनें ठीक चलाने के लिए, लेकिन मेरे कोड काम करने पर कोई प्रभाव नहीं। जाहिर है, मेरे असली कोड में त्रुटि जांच का एक बोतलबंद है जिसे मैंने बाहर रखा है, इसलिए इसके बारे में चिंता न करें!

तो मेरा प्रश्न: मैं एम्बेडेड दुभाषिया को अपनी स्क्रिप्ट पर उचित तरीके से कैसे निर्देशित करूं ताकि मैं कक्षाओं को तुरंत चालू कर सकूं?

उत्तर

16

आप userscript और नहीं userscript.py भी PyImport_ImportModule का उपयोग यह सीधे लेता है निर्दिष्ट करने की आवश्यकता एक char *

userscript.py पैकेज userscript

इस कोड में मॉड्यूल py का मतलब मेरे लिए काम करता है:

#include <stdio.h> 
#include <stdlib.h> 
#include <Python.h> 

int main(void) 
{ 
    const char *scriptDirectoryName = "/tmp"; 
    Py_Initialize(); 
    PyObject *sysPath = PySys_GetObject("path"); 
    PyObject *path = PyString_FromString(scriptDirectoryName); 
    int result = PyList_Insert(sysPath, 0, path); 
    PyObject *pModule = PyImport_ImportModule("userscript"); 
    if (PyErr_Occurred()) 
     PyErr_Print(); 
    printf("%p\n", pModule); 
    Py_Finalize(); 
    return 0; 
} 
+1

बहुत धन्यवाद - यह मुझे दीवार के माध्यम से मिला! अब परीक्षण स्क्रिप्ट के साथ क्या गलत है यह जानने के लिए मैं बुला रहा हूँ! – Fritz

+0

पायथन 3 में, PyString_FromString चला गया है। इसके बजाए PyBytes_FromString का प्रयोग करें। – edj