为什么PyImport_ImportModule返回NULL对象类型而不是NULL ptr?

2024-04-25 17:52:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将使用PyRun_SimpleString编写的代码转换为使用C API的代码。在

我注意到我的代码中有一些不寻常的行为。在

1)使用PyObject_SetAttrString()修改version属性后,Py_GetVersion()返回的版本与PyObject_GetAttrString(sys,“version”)不同

2)文件夹中存在的模块“sympy” C: \程序文件(x86)\Anaconda3\Lib\site包 似乎加载不成功。但是,PyObject不是nullptr。 已确认sypy模块在python命令行中正常工作。在

3)不存在的模块“not a real module”返回nullptr。在

4)在中断模式下使用MSVS2015查看PyPyObjects sys_path和folder_path具有奇怪的对象类型。系统路径为obj_类型“\x3”,文件夹路径为“无法读取内存”。我注意到其他pyobject似乎也有无意义的对象类型,但是工作正常。我的最佳猜测是指向对象类型的指针为null,并返回随机内存,然后尝试将其转换为字符串。为什么pyobject会像预期的那样工作?在

那么为什么PyImport_ImportModule为“sympy”模块返回null对象类型,而为“not a real module”返回nullptr?这种未定义的行为是否是MSVS2015的问题,python3.x等的问题。?在

我在这个问题上遇到了困难,任何建议都将不胜感激。在

下面的代码段重新运行:

   python
   [MSC v.1900 32 bit (Intel)]
   C:\Users\ch816\Dropbox (Personal)\expressionParser\python35


   3.5.2 |Continuum Analytics, Inc.| (default, Jul  5 2016, 11:45:57) [MSC v.1900 32 bit (Intel)]
   3.5.2 |Continuum Analytics, Inc.| (default, Jul  5 2016, 11:45:57) [MSC v.1900 32    bit (Intel)]
   3.5.2 (default, Jul  5 2016, 11:45:57) [MSC v.1900 32 bit (Intel)]


   C:\Program Files (x86)\Anaconda3\python35.zip
   C:\Users\ch816\Dropbox (Personal)\expressionParser\python35\Lib
   C:\Users\ch816\Dropbox (Personal)\expressionParser\python35\DLLs
   C:\Users\ch816\Dropbox (Personal)\pythonIO\Debug
   C:\Users\ch816\Dropbox (Personal)\expressionParser\python35
   C:\Users\ch816\Dropbox (Personal)\expressionParser\python35\lib\site-packages


   C:\Program Files (x86)\Anaconda3\python35.zip
   C:\Users\ch816\Dropbox (Personal)\expressionParser\python35\Lib
   C:\Users\ch816\Dropbox (Personal)\expressionParser\python35\DLLs
   C:\Users\ch816\Dropbox (Personal)\pythonIO\Debug
   C:\Users\ch816\Dropbox (Personal)\expressionParser\python35
   C:\Users\ch816\Dropbox (Personal)\expressionParser\python35\lib\site-packages
   C:\Program Files (x86)\Anaconda3\Lib\site-packages
Py_Initialize();

std::cout << ws2s(Py_GetProgramName()) << "\n";
std::cout << std::string(Py_GetCompiler()) << "\n";
std::cout << ws2s(Py_GetExecPrefix()) << "\n";
std::cout << "\n\n";

PyObject* sys = PyImport_ImportModule("sys");

std::cout << std::string(Py_GetVersion()) << "\n";

PyObject_SetAttrString(
    sys, 
    "version", 
    PyUnicode_FromString("3.5.2 (default, Jul  5 2016, 11:45:57) [MSC v.1900 32 
bit (Intel)]")
);

std::cout << std::string(Py_GetVersion()) << "\n";
std::cout << PyObj2String(PyObject_GetAttrString(sys, "version")) << "\n";
std::cout << "\n\n";

PyObject* sys_path = PyObject_GetAttrString(sys, "path");
for (auto& p : PyList2Vec(sys_path)) {
    std::cout << p << "\n";
}

std::cout << "\n\n";

PyObject* folder_path = PyUnicode_FromString("C:\\Program Files (x86)\\Anaconda3\\Lib\\site-packages");
PyList_append(sys_path, folder_path);

for (auto& p : PyList2Vec(sys_path)) {
    std::cout << p << "\n";
}

PyObject* pSympyMod = PyImport_ImportModule("sympy");
PyObject* pDict = PyModule_GetDict(pSympyMod);
PyObject* symbolsFunc = PyObject_GetAttrString(pSympyMod, "symbols");
PyObject* pNotaMod = PyImport_ImportModule("not a real module");

Tags: pathpylibsysusersx86personaldropbox