gpt4 book ai didi

python - 使用子进程 PIPE 在 Python 脚本之间发送字符串

转载 作者:太空宇宙 更新时间:2023-11-03 15:20:46 25 4
gpt4 key购买 nike

我想在我的主 Python 程序中使用子进程打开一个 Python 脚本。我希望这两个程序能够在它们都在运行时相互聊天,这样我就可以监视从属脚本中的事件,即我需要它们在彼此之间发送字符串。

主程序将有一个类似的功能,它将与从脚本进行通信和监控:

脚本 1

import subprocess
import pickle
import sys
import time
import os

def communicate(clock_speed, channel_number, frequency):
p = subprocess.Popen(['C:\\Python27\\pythonw','test.py'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
data = pickle.dumps([clock_speed, channel_number, frequency]).replace("\n", "\\()")
print data
p.stdin.write("Start\n")
print p.stdout.read()
p.stdin.write(data + "\n")
p.poll()
print p.stdout.readline()
print "return:" + p.stdout.readline()
#p.kill()

if __name__ == '__main__':
print "GO"
communicate(clock_speed = 400, channel_number = 0, frequency = 5*1e6)

test.py 脚本看起来与此类似:

脚本 2

import ctypes
import pickle
import time
import sys

start = raw_input("")
sys.stdout.write("Ready For Data")
data = raw_input("")
data = pickle.loads(data.replace("\\()", "\n"))
sys.stdout.write(str(data))
###BUNCH OF OTHER STUFF###

我希望这些脚本执行以下操作:

  1. 脚本 1 使用 Popen 打开脚本 2
  2. 脚本 1 发送字符串“Start\n”
  3. 脚本 2 读取此字符串并发送字符串“Ready For Data”
  4. 脚本 1 读取这个字符串并将 pickled 数据发送给脚本 2
  5. 然后随便...

主要问题是如何完成第 2-4 部分。然后应该遵循两个脚本之间的其余通信。截至目前,我只能在脚本 2 终止后从中读取字符串。

非常感谢任何帮助。

更新:

脚本 1 必须使用 32 位 Python 运行,而脚本 2 必须使用 64 位 Python 运行。

最佳答案

管道的问题是,如果你调用了一个读操作,没有什么可读的,你的代码就会卡住,直到对方写了一些东西给你读。此外,如果您写入过多,您的下一个写入操作可能会阻塞,直到另一方从管道中读取某些内容并将其释放。

您可以进行“非阻塞调用”,在这些情况下会返回错误而不是阻塞,但您的应用程序仍需要明智地处理错误。

无论如何,您都需要设置某种协议(protocol)。想一想 HTTP 或您熟悉的任何其他协议(protocol):有请求和响应,当您阅读这两种协议(protocol)中的任何一种时,协议(protocol)总是会告诉您是否还有其他内容需要阅读。这样一来,您始终可以就是否等待更多数据做出明智的决定。

这是一个有效的例子。它之所以有效,是因为存在以下协议(protocol):

  • p1 发送单行,以'\n'结尾;
  • p2 做同样的事;
  • p1 发送另一条线;
  • p2 做同样的事;
  • 双方都很高兴并退出。

为了向管道(两侧)写入一条线并确保它进入管道,我调用了 write() 然后调用了 flush() .

为了从管道(在任一侧)读取一行但不多读一个字节,从而阻塞我的代码直到该行准备就绪且不超过该行,我使用 readline().

您可以进行其他调用和其他协议(protocol),包括现成的调用,但单线协议(protocol)适用于简单的事情和像这样的演示。

p1.py:

import subprocess

p = subprocess.Popen(['python', 'p2.py'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
p.stdin.write("Hello\n")
p.stdin.flush()
print 'got', p.stdout.readline().strip()
p.stdin.write("How are you?\n")
p.stdin.flush()
print 'got', p.stdout.readline().strip()

p2.py:

import sys

data = sys.stdin.readline()
sys.stdout.write("Hm.\n")
sys.stdout.flush()
data = sys.stdin.readline()
sys.stdout.write("Whatever.\n")
sys.stdout.flush()

关于python - 使用子进程 PIPE 在 Python 脚本之间发送字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15396628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com