То, что вы делаете неправильно, это именно то, что я делал неправильно.
Вы инициализируете свой собственный словарь globals
пустым.Это означает, что даже такие вещи, как __import__
, не определены для текущей области.
В вашем простом примере вы можете заменить
run = PyRun_String("from time import time,ctime\n"
"print 'Today is',ctime(time())\n"
"test = 5\n"
"print test\n", Py_file_input, globals, locals);
на
PyRun_SimpleString("from time import time,ctime\n"
"print 'Today is',ctime(time())\n"
"test = 5\n"
"print test\n");
You 'Я, вероятно, захочу полностью удалить globals
и locals
.
Если я узнаю, как получить доступ к глобальному диктатуру default , я добавлю комментарий или отредактирую здесь.
Редактировать: Реализация PyRun_SimpleStringFlags
(Python 2.7.3) выглядит следующим образом:
int PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
{
PyObject *m, *d, *v;
m = PyImport_AddModule("__main__");
if (m == NULL)
return -1;
d = PyModule_GetDict(m);
v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
...
Таким образом, чтобы получить по умолчанию globals диктуют, что вам придется импортировать __main__
и получить его словарь .Он будет содержать все встроенные функции по умолчанию и т. Д.