【问题标题】:python: how to redirect file output to streampython:如何将文件输出重定向到流
【发布时间】:2015-03-04 12:29:09
【问题描述】:

我正在开发可执行文件的 GUI 版本。该文件有一个选项

exefile --output output.txt

我的任务不是保存到 output.txt,而是可以使用文件中的一些信息来绘制图形吗?我有一些想法来使用 pyqtgraph 绘制图形。问题是如何将其作为文本流获取?有什么想法吗?

第二个问题类似,但难度稍大一些。同样的可执行文件也可以输出为.wav

exefile --outwav outwav.wav

如何以某种“实时”方式将其绘制出来,而不是保存 .wav 文件? 非常感谢。

注意:

  1. 我的意图是构建一个包装器,我在可执行文件中没有任何控制权。

  2. 理想情况下,可执行文件应该连续运行,而我在此期间绘制输出/波形

【问题讨论】:

  • 您的问题不清楚。为什么不output = open(path, 'w'); output.write(...)print >> output, data
  • 他正在对保存到磁盘的 exe 进行包装。他不想保存到磁盘,而是将输出读取到变量中,以便绘制绘图。
  • 将程序输出重定向到文件可以这样做:import sys sys.stdout = open('file', 'w')
  • 另外,他无法控制可执行文件,因此他无法像那样重定向输出。 @cityzz 你最好的办法是运行 exe 并让它保存到一个文件中,然后在你的应用程序中读取该文件的内容,然后删除该文件。
  • 是的,Ionut Hulub 是对的,很抱歉造成这种混乱。

标签: python python-2.7


【解决方案1】:

假设:

  • 您使用的是 Unix 平台(Linux、Mac OSX)
  • 原来的exefile没办法为所欲为
  • 你不想/不能修改exefile

最好的选择是使用named pipe

这就像一个临时文件一样工作,但不会影响硬盘驱动器 - 一切都发生在内存中。与临时文件相比,它有几个优点:

  • 您可以每秒处理数 GB,而不会破坏磁盘 I/O
  • 您不必同步读取,不必特别小心 EOF,也不必真正知道 exefile 何时完成写入。
  • 避免填满文件系统。

您可以使用os.mkfifo 创建命名管道。像从普通文件中读取一样读取它。

请注意,如果写入命名管道的速度比程序读取的速度快,exefile 将定期 I/O 阻塞。同样,如果读取速度快于exefile 写入速度,您的程序将 I/O 阻塞。

【讨论】:

  • 谢谢,我试试看。
  • 似乎在 Windows 上也可以,只是没那么容易。 jonathonreinhart.blogspot.se/2012/12/…
  • @pss 不是。请注意,Windows 上的“命名管道”是一种非常不同的野兽。这里最重要的区别是它没有暴露(挂载)在文件系统树上,所以你不能将它作为参数提供给exefile
  • @goncalopp 任何跨平台建议?我被告知不要使用“平台相关”的方法。 :(
  • @cityzz AFAIK 没有跨平台的方式来截取文件的输出。我认为您没有比使用临时文件更好的选择。如果您需要 Windows 支持,请注意,即使读取同时写入的文件也可能是一个建议,具体取决于 exefile 的实现方式。见file locking on windows
【解决方案2】:

我认为最好的方法是写入临时文件,然后在需要的地方读取。在python中很容易做到:

from tempfile import NamedTemporaryFile
f = NamedTemporaryFile() # this is file object you will read from
f.name # and here you can get it's name

# here is simple way to run your command
import os
exit_code = os.system("execfile --output %s" % (f.name,))
if not exit_code:
    data = f.read()
else:
    print "Oooops. exit code = %s" % (exit_code,)

查看doc了解更多信息。

【讨论】:

  • 可能是这样,但是对于连续运行的可执行文件,我需要使用文件中的一些信息。这个文件同时写入和读取会有什么问题吗?这个文件大小可以控制吗?非常感谢。
  • 可能你最好的选择是尝试- 作为输出文件名,看看它是否适用于你的可执行文件,正如@mhawke 在评论你的问题时指出的那样。但是,如果它没有,你别无选择,只能运行你试图在后台包装的程序并将它的输出指向你也将要阅读的文件。
  • 这可以帮助您弄清楚如何同时读取和写入文件stackoverflow.com/questions/14271216/…
  • 而且您可能必须自己控制文件大小。当输出文件达到某个限制等时,可能会重新启动execfile
  • 是的,我同意你在文件限制部分的看法。制作的时候,我想作者也没有考虑过运行它很长时间。但是,我需要连续显示其结果的图表。
猜你喜欢
  • 2018-03-25
  • 1970-01-01
  • 2018-01-11
  • 2016-10-07
  • 2021-04-29
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多