2016-10-01 8 views
2

Импорт модулей Python из файлов относительно прост с использованием API Python C с помощью pyImport_Import(), однако мне нужно будет использовать функции, хранящиеся в строках. Есть ли способ импортировать модули python из строк (чтобы уточнить: нет файла, код в строке) или мне нужно сохранить строки как временные файлы?Импорт модуля из строки в API Python C

ответ

1

Если мое понимание верное, вы можете использовать PyImport_ImportModule, который принимает const char* name, чтобы указать модуль для импорта.

Поскольку мое понимание было неправильным:

Это, как правило, лучше, чтобы сбросить содержимое в .py файл, а затем выполнять их с PyRun_File, но, если у вас есть строки и хотите работать с теми я думаю вы можете использовать Py_CompileString для компиляции его в объект кода, а затем подать его на PyEval_EvalCode для оценки.

+0

Нет файла; содержимое модуля сохраняется в строке. – Hullu2000

+0

Хм, вы не можете сбросить содержимое в файл и затем импортировать его? Я уверен, что есть функции для выполнения действительного кода python, можете ли вы добавить несколько примеров? –

+0

Мое приложение содержит область редактирования текста, в которой пользователь может ввести код Python и выполнить его. Для выполнения кода программа помещает в функцию и вызывает ее. – Hullu2000

1

Не нужно использовать временные файлы. Используйте этот код:

const char *MyModuleName = "blah"; 
const char *MyModuleCode = "print 'Hello world!'"; 
PyObject *pyModule = PyModule_New(MyModuleName); 
// Set properties on the new module object 
PyModule_AddStringConstant(pyModule, "__file__", ""); 
PyObject *localDict = PyModule_GetDict(pyModule); // Returns a borrowed reference: no need to Py_DECREF() it once we are done 
PyObject *builtins = PyEval_GetBuiltins(); // Returns a borrowed reference: no need to Py_DECREF() it once we are done 
PyDict_SetItemString(localDict, "__builtins__", builtins); 

// Define code in the newly created module 
PyObject *pyValue = PyRun_String(MyModuleCode, Py_file_input, localDict, localDict); 
if (pyValue == NULL) { 
    // Handle error 
} 
else 
    Py_DECREF(pyValue); 

Это код взят из реального коммерческого применения (я слегка измененная ее, удалив обработку ошибок и другие не нужные детали). Просто установите желаемое имя модуля в MyModuleName и код Python в MyModuleCode, и все готово!