我正在尝试将使用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");