PyRun_String returns 一个 NoneType 对象
PyRun_String returns a NoneType object
我正在用 C++ 编写一个 base64 函数。我想使用 python 进行编码,return 将结果发送到我的 C++ program.Here 是我的代码:
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,运行fine.The结果如下:
C:\Users819>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
的 return 值是 NoneType
以及如何使其 return 成为正确的值。
我的环境信息:
System: Windows 10 1909 x64
C++IDE: Visual Studio 2019 Professional
Python version: 3.7.4
Project Config: Release X64
传递 Py_file_input
is similar in effect to passing 'exec'
to the compile
built-in 的 start
参数;这意味着 运行 它就好像它是一个完整的模块(把它想象成要求 import modulename
的 "result";没有 "result")。
只有表达式计算结果为 non-trivial/non-None
,模块或语句不计算,因此对于任何 start
参数但 Py_eval_input
(相当于 'eval'
模式为 compile
),结果将始终为 None
(它只是 None
因为他们需要 return 区分失败的 NULL
和某些东西else 成功,eval
模式需要 PyObject*
return 而不是布尔值)。如果你想计算一个表达式并得到结果,你必须使用 Py_eval_input
作为你的 start
参数。
我正在用 C++ 编写一个 base64 函数。我想使用 python 进行编码,return 将结果发送到我的 C++ program.Here 是我的代码:
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,运行fine.The结果如下:
C:\Users819>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
的 return 值是 NoneType
以及如何使其 return 成为正确的值。
我的环境信息:
System: Windows 10 1909 x64
C++IDE: Visual Studio 2019 Professional
Python version: 3.7.4
Project Config: Release X64
传递 Py_file_input
is similar in effect to passing 'exec'
to the compile
built-in 的 start
参数;这意味着 运行 它就好像它是一个完整的模块(把它想象成要求 import modulename
的 "result";没有 "result")。
只有表达式计算结果为 non-trivial/non-None
,模块或语句不计算,因此对于任何 start
参数但 Py_eval_input
(相当于 'eval'
模式为 compile
),结果将始终为 None
(它只是 None
因为他们需要 return 区分失败的 NULL
和某些东西else 成功,eval
模式需要 PyObject*
return 而不是布尔值)。如果你想计算一个表达式并得到结果,你必须使用 Py_eval_input
作为你的 start
参数。