2012-05-21 17 views
8

मैं अपने पालतू परियोजना में कुछ पायथन एम्बेड करने की कोशिश कर रहा हूं। मैं निम्नलिखित कोड को अपनी समस्या को कम कर दिया:(पायथन सी एपीआई) PyRun_StringFlags अंतर्निहित अंतर्निहित कार्यों?

#include <Python.h> 
#include "iostream" 

int main(int argc, char *argv[]) 
{ 
    Py_Initialize(); 

    PyObject *globals = Py_BuildValue("{}"); 
    PyObject *locals = Py_BuildValue("{}"); 

    PyObject *string_result = PyRun_StringFlags(
     "a=5\n" 
     "s='hello'\n" 
     "d=dict()\n" 
     , 
     Py_file_input, globals, locals, NULL); 
    if (PyErr_Occurred()) {PyErr_Print();PyErr_Clear();return 1;} 
    return 0; 
} 

(। मैं जानता हूँ कि मैं किसी भी संदर्भ को साफ नहीं कर रहा हूँ यह एक उदाहरण है।)

यह

c++ $(python-config --includes) $(python-config --libs) test.cpp -o test 
द्वारा संकलित किया जा सकता

अगर मैं इसे चलाने मैं निम्नलिखित त्रुटि मिलती है:

$ ./test 
Traceback (most recent call last): 
    File "<string>", line 3, in <module> 
NameError: name 'dict' is not defined 

ऐसा लगता है builtin कार्यों लोड नहीं होतीं। मैं import कुछ भी नहीं कर सकता। मुझे लगता है कि __import__ गुम है। मैं लापता मॉड्यूल कैसे लोड कर सकता हूं या जो भी मुझे याद आ रहा है?

धन्यवाद।

उत्तर

7

एक ही रास्ता:

g = PyDict_New(); 
if (!g) 
    return NULL; 

PyDict_SetItemString(g, "__builtins__", PyEval_GetBuiltins()); 

और फिर globals रूप g गुजरती हैं।

+0

धन्यवाद! 'PyEval_GetBuiltins' बिल्कुल वही था जो मुझे चाहिए था। मुझे नहीं पता था कि इसे कैसे ढूंढें। – Simon

4

तुम भी __main__ मॉड्यूल नाम स्थान के अंदर कोड निष्पादित कर सकते हैं:

PyObject *globals = PyModule_GetDict(PyImport_AddModule("__main__")); 
PyObject *obj = PyRun_String("...", Py_file_input, globals, globals); 
Py_DECREF(obj); 

इस तथ्य को क्या PyRun_SimpleStringFlags आंतरिक रूप से करता है।

संबंधित मुद्दे