我想将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库picosat的绑定有关,但我不知道如何处理这个问题。
这个解决方案也不起作用,https://stackoverflow.com/a/29834357/4270148
Python会在
out.stop()ipython也将冻结在
sys.stdout = StringIO()这可能和这事有关。
我没有尝试使用使用子流程的解决方案,因为我需要局部变量cnf,把它传递到子进程中是没有意义的。
我不知道这是否相关,但我在osx-64上使用了conda 3.14.1
发布于 2015-10-20 11:42:00
在这里找到的子流程解决方案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]我不喜欢这个程序被传递的方式(作为),但至少它是工作的。
发布于 2015-10-19 11:32:59
有时,它可能是一个问题,因为Mac只有虚拟终端,而真正的控制台是隐藏的。所以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),您必须手动连接到它。
https://stackoverflow.com/questions/33212863
复制相似问题