【问题标题】:Redirecting stdout and stderr when embedding libPython嵌入 libPython 时重定向标准输出和标准错误
【发布时间】:2014-04-19 16:30:54
【问题描述】:

我在 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,它显然不起作用。

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

【问题讨论】:

    标签: python ios


    【解决方案1】:

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

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

    如果您想在脚本运行后恢复它们,您应该先查看dup 以获取原始值,然后再恢复它们。

    【讨论】:

      猜你喜欢
      • 2012-03-30
      • 2011-10-11
      • 1970-01-01
      • 2022-07-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多