我想将这个详细的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
答案 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),你必须手动连接它。