账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    PyImport_ImportModule可以导入同一个module两次吗?
    76
    0

    代码如下,第二次进入的时候,到PyImport_ImportModule这一行就崩溃,还捕获不到异常

        Py_Initialize();
        char fileName[] = "rabbitProducer.producer";
        try
        {
            PyObject * moduleObj = PyImport_ImportModule(fileName);        
    
            if (moduleObj)
            {
                char functionName[] = "produce";
                PyObject * functionObj = PyObject_GetAttrString(moduleObj, functionName);
    
                if (functionObj)
                {
                    if (PyCallable_Check(functionObj))
                    {
                        PyObject * bytesObject = Py_BuildValue("y#", message,len);
                        PyObject * argsObject = PyTuple_New(1);
                        PyTuple_SetItem(argsObject, 0, bytesObject);
                    
                        if (argsObject)
                        {
                            PyObject * resultObject = PyObject_CallObject(functionObj, argsObject);
                            if (resultObject)
                            {
                                Py_DECREF(resultObject);
                            }
                            else if (PyErr_Occurred())
                            {
                                PyErr_Print();
                            }
                            Py_DECREF(bytesObject);
                            Py_DECREF(argsObject);
                        }
                    }
                    Py_DECREF(functionObj);
                }
                //else PyErr_Clear();
    
                Py_DECREF(moduleObj);
            }
            Py_Finalize();
        }
        catch (PyObject* ex)
        {
            PyException_GetTraceback(ex);
        }
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 一叶青天 普通会员 1楼

      在Python中,PyImport_ImportModule函数可以导入同一个module两次,这取决于你使用的是哪种Python解释器。以下是在大多数Python解释器中,PyImport_ImportModule函数的行为:

      1. Python 3.6及以上版本:

      在Python 3.6及以上版本中,PyImport_ImportModule函数在一次导入过程中只允许一次__import__操作。__import__函数是在当前模块中搜索该模块,如果没有找到,就从模块所在的包中导入。如果你在当前模块中导入了模块,__import__函数会返回该模块,然后你可以再次使用__import__函数从模块所在的包中导入,这将导致两次导入同一个模块。

      当然,你可以使用PyImport_Import()函数来导入多个模块,但__import__函数只在一次导入中执行,所以即使你对多个模块进行了__import__操作,它们的引用仍会在每次导入后被保留。

      1. Python 2.7及以下版本:

      在Python 2.7及以下版本中,PyImport_ImportModule函数在一次导入过程中允许一次__import__操作。__import__函数是在当前模块中搜索该模块,如果没有找到,就从模块所在的包中导入。但是,如果在当前模块中导入了模块,那么在第一次__import__操作后,该模块的引用已经被删除,所以你在第二次__import__操作时将不会看到它。

      如果你想在Python 2.7及以下版本中导入多个模块,你可能需要使用importlib模块,这是一个独立的Python库,用于导入模块并提供模块的元数据,如包名、类名等。使用importlib模块时,你可以定义一个模块文件的结构,每个模块文件包含一个模块名和一个包含模块对象的模块元数据,这样就可以在同一个模块文件中导入多个模块。

      以下是一个简单的示例:

      ```python from importlib import import_module

      module1 = import_module('module1') module2 = import_module('module2')

      # 访问模块1的属性和方法 print(module1.name) print(module1.description)

      # 访问模块2的属性和方法 print(module2.name) print(module2.description) ```

      这将输出以下结果:

      module1 module2

      注意,虽然在Python 2.7及以下版本中,__import__函数允许在一次导入中执行多次__import__操作,但在Python 3.6及以上版本中,这个行为已经被禁用,因为Python 3.6及以上版本已不再支持在模块中直接导入模块。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部