Загружаются ли PyImport_ImportModule и оператор импорта в другое пространство имен?

Вот канонический пример программа , расширяющая встроенный Python 3.x в C / C ++:

#include 
//// Definition of 'emb' Python module ////////////////////
static PyObject* emb_foo(PyObject *self, PyObject *args)
{
    char const* n = "I am foo";
    return Py_BuildValue("s", n);
}
static PyMethodDef EmbMethods[] = {
    {"foo", emb_foo, METH_VARARGS, "Returns foo"},
    {NULL, NULL, 0, NULL}
};
static PyModuleDef EmbModule = {
    PyModuleDef_HEAD_INIT, "emb", NULL, -1, EmbMethods,
    NULL, NULL, NULL, NULL
};
static PyObject* PyInit_emb(void)
{
    return PyModule_Create(&EmbModule);
}
//// Embedded Python with 'emb' loaded ////////////////////
int main()
{
    PyImport_AppendInittab("emb", &PyInit_emb);
    Py_Initialize();

    PyRun_SimpleString("import emb\n");       // (1)
    //PyImport_ImportModule("emb");           // (2)

    PyRun_SimpleString("print(emb.foo())\n"); // (3)

    Py_Finalize();
    return 0;
}

Я добавляю модуль emb к встроенным программам встроенного интерпретатора. Я бы хотел также нравится импортировать его автоматически, поэтому пользователям не нужно вводить оператор import emb в своих сценариях, предоставленных моему встроенному интерпретатору. Я пробую два способа импорта в строках (1) и (2) .

Работает (1) , а модуль emb можно найти без явного импорта в простой тест в строке (3) . Однако, если я закомментирую строку (1) и раскомментирую строку (2) для импорта с помощью C API вызова Python 3, тогда строка (3) выдает ошибку:

Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'emb' is not defined

Я хотел бы понять, в чем разница между двумя способами импорта. { {1}} Импортируют ли они модуль в разные пространства / области имен ?

Документация Python 3 привела меня по этому пути:

  1. PyImport_ImportModule лучше всего описывается со ссылкой на встроенный Функция Python __ import __ ()
  2. __ import __ () функция вызывается оператором импорта.

Возможно, я ошибся, предполагая, что PyImport_ImportModule является взаимно однозначным эквивалентом, и я должен использовать PyImport_ImportModuleEx с правильными (какими именно?) Глобальными и локальными переменными, поэтому мой 'emb 'попадает в глобальное пространство имен моего встроенного интерпретатора.

6
задан Amro 19 August 2012 в 21:40
поделиться