首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获python中c-模块的打印输出。

捕获python中c-模块的打印输出。
EN

Stack Overflow用户
提问于 2015-10-19 11:09:57
回答 2查看 632关注 0票数 3

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

代码语言:javascript
复制
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会在

代码语言:javascript
复制
out.stop()

ipython也将冻结在

代码语言:javascript
复制
sys.stdout = StringIO()

这可能和这事有关。

我没有尝试使用使用子流程的解决方案,因为我需要局部变量cnf,把它传递到子进程中是没有意义的。

我不知道这是否相关,但我在osx-64上使用了conda 3.14.1

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-20 11:42:00

在这里找到的子流程解决方案https://stackoverflow.com/a/5136686/4270148,实际上是有效的!

代码语言:javascript
复制
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]

我不喜欢这个程序被传递的方式(作为),但至少它是工作的。

票数 1
EN

Stack Overflow用户

发布于 2015-10-19 11:32:59

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

尝试使用stderr代替:

代码语言:javascript
复制
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),您必须手动连接到它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33212863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档