2015-09-09 1 views
0

У меня есть два скрипта python, для аргументов давайте позвоним им A и B. Оба A и B содержат цикл while, который работает неограниченно. Они показывают прямые каналы двух разных устройств сбора данных. Script 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" 
+1

Почему вы не можете поместить эти оба в один скрипт и, возможно, использовать поток? Действительно ли они должны быть в отдельных терминалах? –

+0

ваш вопрос слишком широк, вы можете использовать любой [метод IPC] (https://en.wikipedia.org/wiki/Inter-process_communication), например, если оба скрипта используют 'select()' уже, тогда было бы удобно используйте сокет или трубу для связи. – jfs

ответ

0

Одним вариантом было бы использовать переменную окружения. См. here.

Затем в скрипте A вы пишете что-то переменному окружения, а в скрипте B вы проверяете его. Вам нужно будет рассмотреть случаи race condition, так что, например, B может проверять переменную, которая еще не существует. Если вы сделаете его существовавшим до цикла while в B, то вы можете переписать действующее нажатие клавиши с A до того, как оно будет обнаружено B.

Эти условия в основном существуют во время запуска, поэтому вы можете, например , сначала сначала запускайте один из сценариев, или не нажимайте кнопку, пока оба сценария не будут запущены.

+2

Я не думаю, что это сработает ... поскольку python работает в подоболочке ... эти изменения будут видны только в процессах, которые запускал экземпляр python ... –

1

, если вам действительно нужно сделать это так, вам понадобится механизм передачи данных ... это может быть просто простой файл JSON или сервер базы данных Redis ....

в основном один сценарий записывает свой вывод в файл другой сценарий сканирует файл (периодически)

Тереза ​​нет кода для этого ответа .... извините

лучшей идеей будет использовать нити или многопроцессорных

+0

У меня есть нулевые знания об использовании потоков. У вас есть ссылка на рабочий пример? –

1

Почему бы не использовать общий в базе данных между t он два сценария?

Вы можете просто использовать sqlite3, который поддерживает общие базы данных в памяти и уже включен в стандартную библиотеку Python, или, может быть, Redis (http://redis.io/), если вы хотите попробовать что-то более интересное.

EDIT: в памяти базы данных в sqlite3 могут быть разделены только между потоками, а не процессы: https://www.sqlite.org/sharedcache.html

Итак, как Йоран Бизли отметил, если вам нужно разделить между процессом, Redis может быть вашим другом!

+0

Подождите, пока вы сможете делиться базами данных в sqlite3 между процессами? whoa ... вы просто взорвали мой разум ... –

+1

О, извините, после дальнейшего изучения, sqlite3 поддерживает общие базы данных в памяти, но между потоками, а не между процессами. cf: https://www.sqlite.org/sharedcache.html –

+0

ahhh dang вы меня возбудили: P –