从python中的c模块捕获打印输出

时间:2015-10-19 11:09:58

标签: python c printing binding output

我想将这个详细的pycosat输出存储到字符串中:

import pycosat
cnf = [[1, -5, 4], [-1, 5, 3, 4], [-3, -4]]
pycosat.solve(cnf,verbose=5)

我找到了各种解决方案,例如 Capture stdout from a script in Python

然而,基于stringIO()的解决方案不捕获pycosat输出。输出正常打印,并捕获空字符串。

我认为这与pycosat绑定到c-library picosat的事实有关,但我不知道如何解决这个问题。

此解决方案也不起作用 https://stackoverflow.com/a/29834357/4270148

Python会冻结在

out.stop()

ipython也会冻结在

sys.stdout = StringIO()

可能与它有关。

我没有尝试使用子进程的解决方案,因为我需要局部变量cnf,将它传递给子进程并没有意义。

我不知道它是否应该相关,但我在osx-64上使用conda 3.14.1

2 个答案:

答案 0 :(得分:1)

此处找到的子流程解决方案https://stackoverflow.com/a/5136686/4270148,确实有效!

import subprocess
proc = subprocess.Popen(["python", "-c",
    "cnf = [[1, -5, 4], [-1, 5, 3, 4], [-3, -4]];\
    import pycosat;\
    pycosat.solve(cnf,verbose=5);"],
    stdout=subprocess.PIPE)
out = proc.communicate()[0]

我不喜欢程序传递的方式(作为eval-string),但至少它可以工作。

答案 1 :(得分:0)

有时它可能是一个问题,因为Mac OS只有虚拟终端,而真正的控制台是隐藏的。所以stdout和stderr有时候会很奇怪。 (非常罕见的场合)

尝试使用stderr:

from cStringIO import StringIO
import sys
import pycosat
cnf = [[1, -5, 4], [-1, 5, 3, 4], [-3, -4]]
sys.stderr = StringIO()
pycosat.solve(cnf,verbose=5)
solution = sys.stderr.getvalue()
sys.stderr = sys.__stderr__
print solution

如果这仍然没有用,那么pycosat正在使用另一个filedescriptor作为其输出(既不是stdout也不是stder),你必须手动连接它。