如何防止 Py_Finalize 关闭 stderr?

问题描述 投票:0回答:2

我有一个 c++ 代码,它加载了一个使用 stderr 的 python 拦截器:

intereptor.pyx
stderr_dup = os.fdopen(sys.stderr.fileno(), 'wb', 0)

问题是调用Py_Finalize后,stderr关闭了,我在c++里用不了。 我应该用 C++ 重新打开它吗?

open(stderr)
或者我可以从 python 端 (os.dup/dup2) 阻止这种行为?
我厌倦了将上面的 fdopen 替换为:

stderr_dup = os.dup(sys.stderr.fileno())
但是 Py_Finalize 仍然关闭 stderr。

python c++ cython pythoninterpreter
2个回答
0
投票
你可以更容易地从 Python 端解决这个问题:

stderr_dup = os.fdopen(sys.stderr.fileno(), 'wb', 0, closefd=False)
来自文档:

如果 closefd 为 False 并且给出了文件描述符而不是文件名,则在文件关闭时底层文件描述符将保持打开状态。


0
投票
你应该将 stderr 复制到一个额外的文件描述符中,然后在 Python 的东西完成后将该文件描述符设置为 stderr。

int stderr_copy = dup(stderr); // ... Python ... dup2(stderr_copy, stderr);
    
© www.soinside.com 2019 - 2024. All rights reserved.