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

时间:2017-04-09 21:30:08

标签: python c++ python-3.x python-c-api

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

我在代码中发现了一些不寻常的行为。

1)Py_GetVersion()在使用PyObject_SetAttrString()

修改版本属性后返回与PyObject_GetAttrString(sys," version")不同的版本

2)模块" sympy"它存在于文件夹中        C:\ Program Files(x86)\ Anaconda3 \ Lib \ site-packages 似乎没有成功加载。但是,PyObject不是nullptr。 已确认sympy模块在python命令行中正常工作。

3)模块"不是真正的模块"不存在的返回nullptr。

4)当使用MSVS2015以中断模式查看时,PyPyObjects sys_path和folder_path具有奇怪的对象类型。 sys_path是obj_type" \ x3"和folder_path是"无法读取内存"。我注意到其他PyObjects似乎也有非感觉对象类型,但按预期工作。我最好的猜测是指向对象类型的指针为null并返回随机内存,然后尝试将其转换为字符串。为什么那时PyObjects按预期工作?

那么为什么PyImport_ImportModule为" sympy"返回一个空对象类型?模块但是一个nullptr用于"不是真正的模块"?这是未定义的行为,MSVS2015的问题,python 3.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");

0 个答案:

没有答案