嵌入libPython时重定向stdout和stderr

问题描述 投票:3回答:1

我在iOS应用程序中嵌入了libPython.a,我正在使用PyRun_SimpleFileEx运行脚本:

    Py_SetPythonHome((char *)[resourcePath UTF8String]);

    Py_Initialize();

    const char* argv[] = {
       …
       ">/dev/null"
    };
    PySys_SetArgv(sizeof(argv)/sizeof(char*), (char**)argv);

    PyEval_InitThreads();

    const char* prog = ...;

    FILE* fd = fopen(prog, "r");
    if (fd == NULL) {
        ret = 1;
    } else {
        ret = PyRun_SimpleFileEx(fd, prog, 1);
        if (ret != 0)
            NSLog(@"Application quit abnormally!");
    }

    Py_Finalize();

一切正常,但我没有找到一种方法来重定向stdout / stderr,以便我没有登录iOS控制台。

我尝试添加“> / dev / null”作为脚本的附加参数,但它显然不起作用,因为没有shell。

如何在这种情况下重定向stdout / stderr?或者,有一种方法可以“拦截”所有Python输出调用?谢谢。

python ios
1个回答
0
投票

当以这种方式使用libpython时,stdoutstderr是调用PyRun_SimpleFileEx的进程。你可以试试

freopen("/dev/null", "w", stdout);
freopen("/dev/null", "w", stderr);

如果要在脚本运行后恢复它们,则应首先查看dup以获取原始值,然后将其还原。

© www.soinside.com 2019 - 2024. All rights reserved.