PyRun_String返回一个NoneType对象
PyRun_String returns a NoneType object
我正在用c++编写一个base64函数。我想使用python进行编码,并将结果返回给我的c++程序。这是我的代码:
string EncodeBase64(string str)
{
Py_Initialize();
PyObject* ret1 = NULL;
PyObject* ret2 = NULL;
PyObject* main = PyImport_AddModule("__main__");
PyObject* _g = PyModule_GetDict(main);
PyObject* _l = PyDict_New();
string py = "str(base64.b64encode('" + str + "'.encode('utf-8')), 'utf-8')";
string pyb = "base64.b64encode('" + str + "'.encode('utf-8'))";
char* rec = new char[8192];
cout << "Request 1: " << py << endl;
cout << "Request 2: " << pyb << endl;
PyRun_SimpleString("import base64");
ret1 = PyRun_String(py.c_str(), Py_file_input, _g, _l);
main = PyImport_AddModule("__main__");
_g = PyModule_GetDict(main);
_l = PyDict_New();
ret2 = PyRun_String(pyb.c_str(), Py_file_input, _g, _l);
if (!ret1)
{
cout << "Can not get return value 1." << endl;
}
else
{
cout << "Type of Return Value 1: " << ret1->ob_type->tp_name << endl;
}
if (!ret2)
{
cout << "Can not get return value 1." << endl;
}
else
{
cout << "Type of Return Value 2: " << ret1->ob_type->tp_name << endl;
}
Py_Finalize();
return "";
}
我输入一个字符串"123456",程序输出这个:
Request 1: str(base64.b64encode('123456'.encode('utf-8')), 'utf-8')
Request 2: base64.b64encode('123456'.encode('utf-8'))
Type of Return Value 1: NoneType
Type of Return Value 2: NoneType
我尝试将请求字符串输入到python中,运行良好。结果如下:
C:Users15819>python
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import base64
>>> str(base64.b64encode('123456'.encode('utf-8')), 'utf-8')
'MTIzNDU2'
>>> base64.b64encode('123456'.encode('utf-8'))
b'MTIzNDU2'
我想知道为什么PyRun_String
的返回值是NoneType
,以及如何使其返回正确的值。我的环境信息:
System: Windows 10 1909 x64
C++IDE: Visual Studio 2019 Professional
Python version: 3.7.4
Project Config: Release X64
传递Py_file_input
的start
参数的效果类似于将'exec'
传递到内置的compile
;这意味着把它当作一个完整的模块来运行(把它想象成请求import modulename
的"结果";没有"结果"(。
只有表达式计算为非平凡/非None
结果,而不是模块或语句,因此对于除Py_eval_input
之外的任何start
参数(相当于compile
的'eval'
模式(,结果将始终是None
(这只是None
,因为它们需要返回一些东西来区分失败的NULL
和成功的其他东西,并且eval
模式需要PyObject*
返回而不是布尔值(。如果要计算表达式并获得结果,则必须使用Py_eval_input
作为start
参数。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '