两个程序可以同时更新一个文本文件(实时通信)吗?

Posted

技术标签:

【中文标题】两个程序可以同时更新一个文本文件(实时通信)吗?【英文标题】: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 所说的,***.com/questions/6977561/pipe-vs-temporary-file 我认为您无法实现“几乎”部分-更改将立即可见...(如果您真的想使用文本文件方法,请阅读打开文件的共享模式-即***.com/questions/222089/…) 我知道,如果 C 部分是通过 subprocess.Popen 从 python 运行的,只需指定 stdout=subprocess.PIPEstdinstderr 相同),然后你就可以建立管道可以.communicate用它。 值得回答吗?我不知道从 C# 端如何进行通信......好吧,就像你写入标准输出 / 从标准输入读取一样...... 【参考方案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.In 和 write data to System.Console.Out,尽管如果您使用 C# 编写了在终端中运行的程序,则使用相同的方法将数据写入screen 和读取用户的输入也可以在这里工作。 (你可以把.stdout想象成终端屏幕和数据python写入.stdin用户输入)

【讨论】:

以上是关于两个程序可以同时更新一个文本文件(实时通信)吗?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以同时运行两个 apk 并使它们通过 Windows 服务进行通信?

iOS 我可以同时维护同一个应用的两个应用版本吗?

我们可以在应用程序处于审查模式时更改应用程序中的实时数据库吗?

两个程序同时调用一个DLL可以吗

没有服务器的通信

第六周总结