如何打印PyRun_String返回的对象?
How to print the object returned by PyRun_String?
我想知道如何使用 Pyrun_String
的 return。
我已经尝试使用 PyUnicode_DATA
和 PyObject_Str
。
if (!(pstr = PyRun_String("a = 1", Py_single_input, pGlobal, pdict)))
exit(printf("Error while running string\n"));
// I tried this
PyObject *pstr = PyObject_Str(pstr);
void* test = PyUnicode_DATA(pstr);
printf("%s\n", (char*)test);
// or this
if (!PyArg_Parse(pstr, "s", &cstr))
exit(printf("Bad result type\n"));
printf("%s\n", cstr);
您可以使用 PyObject_Repr()
获取对象的字符串表示形式(如 Python 的 repr()
),然后将其传递给 PyUnicode_AsUTF8()
以获取 UTF -8 编码的 C 字符串。不要忘记先用 PyUnicode_Check()
检查一下。
工作示例:
#include <stdio.h>
#include <Python.h>
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "Usage: %s PYTHON_CODE\n", argv[0]);
return 1;
}
Py_Initialize();
PyObject *dict = PyDict_New();
PyObject *pstr;
if (!(pstr = PyRun_String(argv[1], Py_single_input, dict, dict))) {
fputs("PyRun_String failed\n", stderr);
return 1;
}
PyObject *rep = PyObject_Repr(pstr);
if (!PyUnicode_Check(rep)) {
fputs("repr is not unicode (this should not happen!)\n", stderr);
return 1;
}
const char *str_rep = PyUnicode_AsUTF8(rep);
puts(str_rep);
}
示例输出:
$ ./x 'a = 1'
None
$ ./x '(1,2,3)'
(1, 2, 3)
None
$ ./x 'x = {"a": 1}; x; x["a"]'
{'a': 1}
1
None
您总是会得到一个额外的 None
,因为那是整个脚本的“return 值”。
我想知道如何使用 Pyrun_String
的 return。
我已经尝试使用 PyUnicode_DATA
和 PyObject_Str
。
if (!(pstr = PyRun_String("a = 1", Py_single_input, pGlobal, pdict)))
exit(printf("Error while running string\n"));
// I tried this
PyObject *pstr = PyObject_Str(pstr);
void* test = PyUnicode_DATA(pstr);
printf("%s\n", (char*)test);
// or this
if (!PyArg_Parse(pstr, "s", &cstr))
exit(printf("Bad result type\n"));
printf("%s\n", cstr);
您可以使用 PyObject_Repr()
获取对象的字符串表示形式(如 Python 的 repr()
),然后将其传递给 PyUnicode_AsUTF8()
以获取 UTF -8 编码的 C 字符串。不要忘记先用 PyUnicode_Check()
检查一下。
工作示例:
#include <stdio.h>
#include <Python.h>
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "Usage: %s PYTHON_CODE\n", argv[0]);
return 1;
}
Py_Initialize();
PyObject *dict = PyDict_New();
PyObject *pstr;
if (!(pstr = PyRun_String(argv[1], Py_single_input, dict, dict))) {
fputs("PyRun_String failed\n", stderr);
return 1;
}
PyObject *rep = PyObject_Repr(pstr);
if (!PyUnicode_Check(rep)) {
fputs("repr is not unicode (this should not happen!)\n", stderr);
return 1;
}
const char *str_rep = PyUnicode_AsUTF8(rep);
puts(str_rep);
}
示例输出:
$ ./x 'a = 1'
None
$ ./x '(1,2,3)'
(1, 2, 3)
None
$ ./x 'x = {"a": 1}; x; x["a"]'
{'a': 1}
1
None
您总是会得到一个额外的 None
,因为那是整个脚本的“return 值”。