Python CAPI和PyRun_文件:使用“导入工具和部分(打印,刷新=True)”

2024-09-29 23:29:42 发布

您现在位置:Python中文网/ 问答频道 /正文

首先是一个简短的背景:

(1)在Python3.6中运行此程序时,我需要等到它结束后才能显示结果:

import time

for i in range(5):
        print(i, end=" ")
        time.sleep(1)

(2)另一方面,该程序按照我的要求运行,每秒钟打印一次值:

import time

import functools
print = functools.partial(print, flush=True)

for i in range(5):
        print(i, end=" ")
        time.sleep(1)

现在我的问题是:

我怎样才能补充呢

import functools
print = functools.partial(print, flush=True)

在C代码中,这样我就可以使用PyRun_文件运行程序1,但结果是否与运行程序2一样

我很难找到简单易懂的文档和示例,所以我希望能得到一些帮助

这就是我尝试过的(省略了错误检查,并且我试图改进的程序中已有的旧代码被标记为“//existing”):

Py_Initialize(); //existing

PyObject* functools = PyImport_ImportModule("functools");
PyObject* partial = PyObject_GetAttrString(functools, "partial");

PyObject* builtins = PyImport_ImportModule("builtins");
PyObject* print = PyObject_GetAttrString(builtins, "print");

PyObject* args = PyTuple_New(1);
PyTuple_SetItem(args, 0, print);

PyObject* kwargs = PyDict_New();
PyDict_SetItemString(kwargs, "flush", Py_True);

PyObject_Call(partial, args, kwargs);

PyObject* main_module = PyImport_ImportModule("__main__"); //existing
PyObject* pdict = PyModule_GetDict(main_module); //existing

FILE* fp = fopen("prg_1.py", "r"); //existing
PyObject* pval = PyRun_File(fp, "prg_1.py", Py_file_input, pdict, pdict); //existing

Py_Finalize(); //existing

不幸的是,这并不像我希望的那样有效,所以有人能发现任何明显的错误,或者可能不是很明显的错误吗

提前感谢您的帮助


Tags: pyimport程序truetime错误partialpyobject
1条回答
网友
1楼 · 发布于 2024-09-29 23:29:42

多亏了DavidW的宝贵意见,它现在可以工作了!谢谢大家!

(我确实遇到了另一个问题,我将在一个新问题中解决。)

添加代码后,代码现在看起来如下所示(错误检查仍被省略):

Py_Initialize(); //existing

PyObject* functools = PyImport_ImportModule("functools");
PyObject* partial = PyObject_GetAttrString(functools, "partial");

PyObject* builtins = PyImport_ImportModule("builtins");
PyObject* print = PyObject_GetAttrString(builtins, "print");

PyObject* args = PyTuple_New(1);
PyTuple_SetItem(args, 0, print);

PyObject* kwargs = PyDict_New();
PyDict_SetItemString(kwargs, "flush", Py_True);

PyObject* newPrint = PyObject_Call(partial, args, kwargs);

PyObject* main_module = PyImport_ImportModule("__main__"); //existing
PyObject* pdict = PyModule_GetDict(main_module); //existing

PyDict_SetItemString(pdict, "print", newPrint);

FILE* fp = fopen("prg_1.py", "r"); //existing
PyObject* pval = PyRun_File(fp, "prg_1.py", Py_file_input, pdict, pdict); //existing

Py_Finalize(); //existing

相关问题 更多 >

    热门问题