【问题标题】:Can a text file be updated by two programs simultaneously (live communication)?两个程序可以同时更新一个文本文件(实时通信)吗?
【发布时间】:2016-04-25 22:47:18
【问题描述】:

我有一个具有 c/c# 能力的程序,并且我有 python。我希望该程序几乎在几毫秒内更新一个文本文件,并让 python 在几毫秒内读取该文本文件。我怎样才能做到这一点?

文本文件是否可以由另一个程序实时更新并由 python 实时读取?有没有其他方法可以做到这一点,而不是依赖文本文件。 基本上我想要做的是使用 python 对该程序的实时数据进行一堆计算,然后以命令的形式将这些计算发送回程序。文件不能关闭并重新打开并在内存中更新吗?

【问题讨论】:

  • 我认为你想要的是管道而不是文件。
  • 补充@TadhgMcDonald-Jensen 所说的,stackoverflow.com/questions/6977561/pipe-vs-temporary-file
  • 我认为您无法实现“几乎”部分-更改将立即可见...(如果您真的想使用文本文件方法,请阅读打开文件的共享模式-即stackoverflow.com/questions/222089/…)
  • 我知道,如果 C 部分是通过 subprocess.Popen 从 python 运行的,只需指定 stdout=subprocess.PIPEstdinstderr 相同),然后你就可以建立管道可以.communicate用它。
  • 值得回答吗?我不知道从 C# 端如何进行通信......好吧,就像你写入标准输出 / 从标准输入读取一样......

标签: c# python c io ipc


【解决方案1】:

如果您使用 subprocess.Popen 从 python 启动 C/C# 进程,那么您的两个程序可以通过 stdinstdout 管道进行通信:

c_program = subprocess.Popen(["ARGS","HERE"],
                             stdin = subprocess.PIPE,  # PIPE is actually just -1
                             stdout= subprocess.PIPE,  # it indicates to create a new pipe
                             stderr= subprocess.PIPE  #not necessary but useful
                             )

然后您可以读取该过程的输出:

data = c_program.stdout.read(n) #read n bytes
#or read until newine
line = c_program.stdout.readline()

请注意,尽管non blocking alternatives 存在,但这两种方法都是阻塞方法。

另请注意,在 python 3 中,这些将返回 bytes 对象,您可以使用 .decode() 方法将其转换为 str

然后要将输入发送到进程,您可以简单地写入标准输入:

c_program.stdin.write(DATA)

与上面的 read 一样,在 python 3 中,此方法需要一个 bytes 对象。您可以使用str.encode 方法对其进行编码,然后再将其写入管道。


我对 C# 的了解非常有限,但从有限的研究来看,您似乎可以使用 read data from System.Console.Inwrite data to System.Console.Out,尽管如果您使用 C# 编写了在终端中运行的程序,则使用相同的方法将数据写入screen 和读取用户的输入也可以在这里工作。 (你可以把.stdout想象成终端屏幕和数据python写入.stdin用户输入)

【讨论】:

    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 2012-07-18
    • 2021-12-26
    • 2012-05-25
    • 2014-08-18
    • 1970-01-01
    相关资源
    最近更新 更多