我对您的程序到底在做什么有点困惑,但听起来好像您有一个C库写入Cstdout(不是Pythonsys.stdout),您希望捕获这个输出并对其进行后处理,而且您已经为C库提供了一个Python绑定,您希望使用它而不是单独使用它C程序。在
首先,您必须使用子进程来执行此操作;其他任何方法都无法可靠地工作。这是因为stdout是进程全局的,因此没有可靠的方法来捕获只有一个线程对stdout的写入。在
其次,您可以使用subprocess.Popen,因为您可以使用它重新调用当前脚本!这就是Python multiprocessing模块在幕后所做的事情,而且自己动手并不难。我将使用一个特殊的、隐藏的命令行参数来区分子对象,如下所示:import argparse
import subprocess
import sys
def subprocess_call_c_lib():
import c_lib
c_lib.do_stuff()
def invoke_c_lib():
proc = subprocess.Popen([sys.executable, __file__,
" internal-subprocess-call-c-lib"
# , ...
],
stdin=subprocess.DEVNULL,
stdout=subprocess.PIPE)
for line in proc.stdout:
# filter output from the library here
# to display to "screen", write to sys.stdout as usual
if proc.wait():
raise subprocess.CalledProcessError(proc.returncode, "c_lib")
def main():
ap = argparse.Parser(...)
ap.add_argument(" internal-subprocess-call-c-lib", action="store_true",
help=argparse.SUPPRESS)
# ... more arguments ...
args = ap.parse_args()
if args.internal_subprocess_call_c_lib:
subprocess_call_c_lib()
sys.exit(0)
# otherwise, proceed as before ...
main()