【问题标题】:Communicate between two scripts. Pass a string of variable from one script to another在两个脚本之间进行通信。将一串变量从一个脚本传递到另一个
【发布时间】:2015-12-06 01:33:31
【问题描述】:

我有两个 python 脚本,为了参数,我们称它们为 ABAB 都包含一个无限期运行的 while 循环。它们显示了两种不同数据收集设备的实时信息。脚本A 能够接受按键。现在,我想做的是让脚本B 识别脚本A 中的按键。每个脚本都在不同的终端中执行。

如何在两个 python 脚本之间尽可能快地进行通信?我如何在不使用虚拟文件的情况下将 string 或类似的东西从脚本 A 传递到脚本 B?对于一个虚拟文件,我正在处理一个文件,该文件在注册按键时由脚本B 不断读取并由脚本A 写入。 有人能指出我正确的方向吗?

两个脚本都使用 while 循环显示实时数据源。因此,两个脚本都不会停止或等待某事非常重要。

脚本 A:

import sys
import numpy
import select

def heardEnter():
  i, o, e = select.select([sys.stdin], [], [], 0.0001)
  for s in i:
    if s == sys.stdin:
      input = sys.stdin.readline()
      return True
  return False


while True:  
  if heardEnter():
    print "A: Pressed enter"

脚本 B:

while True:
  A_press_enter = None
  if A_press_enter == "Enter":
    print "B: Enter was pressed in script A"

【问题讨论】:

  • 为什么你不能把它们放在一个脚本中,或者使用一个线程?他们真的必须在不同的终端吗?
  • 您的问题太宽泛了,您可以使用任何IPC method,例如,如果两个脚本都使用select(),那么使用套接字或管道进行通信可能会很方便。

标签: python pipe subprocess ipc


【解决方案1】:

如果你真的需要这样做,你将需要一个数据传输机制......这可能只是一个简单的 json 文件或一个 redis 数据库服务器......

基本上一个脚本将其输出写入一个文件,另一个脚本扫描该文件(定期)

这个答案没有代码......对不起

一个更好的主意是使用线程或多处理

【讨论】:

  • 我对使用线程的了解为零。你有一个工作示例的链接吗?
【解决方案2】:

为什么不在两个脚本之间使用共享内存数据库?

您可以简单地使用 sqlite3,它支持共享内存数据库并且已经包含在 Python 的标准库中,或者如果您想尝试一些更高级的东西,也可以使用 Redis (http://redis.io/)。

编辑:sqlite3 中的内存数据库只能在线程之间共享,不能在进程之间共享:https://www.sqlite.org/sharedcache.html

正如 Joran Beasley 所指出的,如果您需要在进程之间共享,Redis 可能是您的朋友!

【讨论】:

  • 等待您可以在进程之间共享sqlite3中的内存数据库吗?哇……你让我大吃一惊……
  • 哦,对不起,经过进一步调查,sqlite3支持共享内存数据库,但在线程之间,而不是在进程之间。参考:sqlite.org/sharedcache.html
  • 啊,当你让我兴奋不已:P
【解决方案3】:

一种选择是使用环境变量。见here

然后在脚本 A 中向环境变量写入一些内容,然后在脚本 B 中检查它。您需要考虑race condition 的情况,例如,B 可能正在检查一个尚不存在的变量。如果你让它在 B 中的 while 循环之前存在,那么你可以在 B 检测到之前覆盖来自 A 的有效按键。

这些情况主要存在于启动过程中,因此您可以始终先启动其中一个脚本,或者在两个脚本都运行之前不按任何按钮。

【讨论】:

  • 我认为这行不通...因为python在子shell中运行...这些更改仅在python实例启动的进程中可见...
猜你喜欢
  • 1970-01-01
  • 2017-11-07
  • 2017-10-16
  • 2020-06-09
  • 2011-02-08
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多