我正在尝试将使用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");
目前没有回答
相关问题 更多 >
编程相关推荐