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

标签 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 绑定(bind)到 c-library picosat 这一事实有关,但我不知道如何处理。

这个解决方案也行不通 https://stackoverflow.com/a/29834357/4270148

Python 将卡住在

out.stop()

ipython 也会卡住在

sys.stdout = StringIO()

这可能与它有关。

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

我不知道它是否应该相关,但我在 osx-64 上使用 conda 3.14.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 字符串),但至少它有效。

关于python - 从 python 中的 c 模块捕获打印输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33212863/

相关文章:

python - lambda 中的变量作用域

python - 使用 python 模拟库测试与 Django Rest Framework API 交互的函数

c - 头文件中的全局变量

c - "variable"使用 C 预处理器进行长度初始化

java - 程序将 *.csv 文件读取到数组中并打印内容。需要打印索引号

python - 为什么 Bootstrap 不起作用,尽管我已经加载了它等(Django项目)?

python - 尝试从 CloudWatch 获取最新的 LogStream 时出现奇怪的行为

C 宏 : advantage/intent of apparently useless macro

java - 打印所有 JVM 标志

c++ - 是否有打印可选值的约定?