Python 如何找出PyImportModule导入失败的原因?

Python 如何找出PyImportModule导入失败的原因?,python,python-c-api,python-embedding,Python,Python C Api,Python Embedding,我在嵌入Python(2.7.1)的C应用程序中有以下代码: 失败时,它返回NULL。我如何才能找到它无法导入的原因?(例如,导入模块作品时,请在嵌入外部查找) (代码是的一部分,我想添加更多关于罕见情况下发生故障的信息)。您可以通过查看引发的异常来完成此操作。当前,您要擦除异常(这就是PyErr_Clear()所做的)。不要这样做,而是打印回溯或检查异常对象。有关如何从C代码执行此操作的信息,请参阅,但通常最好的方法是让异常传播。让异常传播不会使C程序崩溃吗?这取决于C程序。如果没有处理异常而

我在嵌入Python(2.7.1)的C应用程序中有以下代码:

失败时,它返回NULL。我如何才能找到它无法导入的原因?(例如,导入模块作品时,请在嵌入外部查找)


(代码是的一部分,我想添加更多关于罕见情况下发生故障的信息)。

您可以通过查看引发的异常来完成此操作。当前,您要擦除异常(这就是
PyErr_Clear()
所做的)。不要这样做,而是打印回溯或检查异常对象。有关如何从C代码执行此操作的信息,请参阅,但通常最好的方法是让异常传播。

让异常传播不会使C程序崩溃吗?这取决于C程序。如果没有处理异常而您没有嵌入Python,则Python将终止(打印回溯后)。如果没有处理异常而您正在嵌入Python,则从嵌入程序调用的最顶层函数将简单地返回错误。但是,如果某个地方处理了异常(例如,在调用此函数并尝试导入模块的Python代码中),则无需崩溃。C代码直接执行,而不会从Python中调用。你能解释一下“嵌入Python”是什么意思吗?我(非常有限)的理解是,从C执行Python是嵌入(用C编写模块并从Python调用它是扩展)。如果Python终止,我的C程序就可以了,只是不能再使用pythonapi了吗?如果C代码是嵌入Python的代码,那么就不能将异常传播到任何地方。您必须立即处理它(通常通过打印回溯)。异常通常不会使Python处于不可用状态,除非异常是由内存损坏或解释器中的某些异常状态引起的。另请参见此问题:
{
PyObject *user_dict;
PyObject *user_func;
PyObject *result;
PyObject *header_tuple;
PyObject *original_recipients;
PyObject *working_recipients;

if (!Py_IsInitialized())
    {
    Py_Initialize();
    }

if (!expy_exim_dict)
    {
    PyObject *module = Py_InitModule(expy_exim_module, expy_exim_methods); /* Borrowed reference */
    Py_INCREF(module);                                 /* convert to New reference */
    expy_exim_dict = PyModule_GetDict(module);         /* Borrowed reference */
    Py_INCREF(expy_exim_dict);                         /* convert to New reference */
    }

if (!expy_user_module)
    {
    if (expy_path_add)
        {
        PyObject *sys_module;
        PyObject *sys_dict;
        PyObject *sys_path;
        PyObject *add_value;

        sys_module = PyImport_ImportModule("sys");  /* New Reference */
        if (!sys_module)
            {
            PyErr_Clear();
            *return_text = "Internal error, can't import Python sys module";
            log_write(0, LOG_REJECT, "Couldn't import Python 'sys' module");
            return PYTHON_FAILURE_RETURN;
            }

        sys_dict = PyModule_GetDict(sys_module);               /* Borrowed Reference, never fails */
        sys_path = PyMapping_GetItemString(sys_dict, "path");  /* New reference */

        if (!sys_path || (!PyList_Check(sys_path)))
            {
            PyErr_Clear();  /* in case sys_path was NULL, harmless otherwise */
            *return_text = "Internal error, sys.path doesn't exist or isn't a list";
            log_write(0, LOG_REJECT, "expy: Python sys.path doesn't exist or isn't a list");
            return PYTHON_FAILURE_RETURN;
            }

        add_value = PyString_FromString(expy_path_add);  /* New reference */
        if (!add_value)
            {
            PyErr_Clear();
            log_write(0, LOG_PANIC, "expy: Failed to create Python string from [%s]", expy_path_add);
            return PYTHON_FAILURE_RETURN;
            }

        if (PyList_Append(sys_path, add_value))
            {
            PyErr_Clear();
            log_write(0, LOG_PANIC, "expy: Failed to append [%s] to Python sys.path", expy_path_add);
            }

        Py_DECREF(add_value);
        Py_DECREF(sys_path);
        Py_DECREF(sys_module);
        }

    expy_user_module = PyImport_ImportModule(expy_scan_module);  /* New Reference */

    if (!expy_user_module)
        {
        PyErr_Clear();
        /* Handle error */
        }
    }