web-dev-qa-db-fra.com

Passer des données entre les scripts Python, tout en s'exécutant séparément

Si un script python est en cours d’exécution (avec l’interface graphique complète de Tkinter et tout le reste) et que je souhaite transmettre les données en direct qu’il recueille (stockées de manière interne dans des tableaux, etc.), quel serait le meilleur moyen de le faire?

Je ne peux pas simplement importer le script A dans le script B car cela créera une nouvelle instance du script A plutôt que d'accéder à des variables du script A en cours d'exécution.

La seule façon de le faire consiste à écrire le script A dans un fichier, puis le script B extrait les données du fichier. Ceci est cependant loin d’être idéal, étant donné que quelque chose de grave risque de se produire si le script B tente de lire un fichier que le script A écrit déjà. Par ailleurs, je recherche une vitesse de communication beaucoup plus rapide entre les deux programmes.

EDIT: Voici les exemples demandés. Je sais pourquoi cela ne fonctionne pas, mais c'est la prémisse de base de ce qui doit être réalisé. Mon code source est très long et malheureusement confidentiel, il ne va donc pas aider ici. En résumé, le script A exécute Tkinter et collecte des données, tandis que le script B représente views.py dans le cadre de Django, mais j'espère que cela pourra être réalisé dans le cadre de Python.

Script A

import time

i = 0

def return_data():
    return i

if __== "__main__":
    while True:
        i = i + 1
        print i
        time.sleep(.01)

Script B

import time
from scriptA import return_data

if __== '__main__':
    while True:
        print return_data()  # from script A
        time.sleep(1)
5
Jordan Gleeson

vous pouvez utiliser le module multiprocessing pour implémenter une Pipe entre les deux modules. Ensuite, vous pouvez démarrer l'un des modules en tant que processus et utiliser le tuyau pour communiquer avec lui. La meilleure partie de l’utilisation des pipes est que vous pouvez également faire passer des objets python tels que dict, list.

Ex: Mp2.py:

from multiprocessing import Process,Queue,Pipe
from mp1 import f

if __== '__main__':
    parent_conn,child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print(parent_conn.recv())   # prints "Hello"

mp1.py:

from multiprocessing import Process,Pipe

def f(child_conn):
    msg = "Hello"
    child_conn.send(msg)
    child_conn.close()
7
Akshay Apte

Vous pouvez utiliser le module de décapage pour transmettre des données entre deux programmes python. 

import pickle 

def storeData(): 
    # initializing data to be stored in db 
    employee1 = {'key' : 'Engineer', 'name' : 'Harrison', 
    'age' : 21, 'pay' : 40000} 
    employee2 = {'key' : 'LeadDeveloper', 'name' : 'Jack', 
    'age' : 50, 'pay' : 50000} 

    # database 
    db = {} 
    db['employee1'] = employee1 
    db['employee2'] = employee2 

    # Its important to use binary mode 
    dbfile = open('examplePickle', 'ab') 

    # source, destination 
    pickle.dump(db, dbfile)                   
    dbfile.close() 

def loadData(): 
    # for reading also binary mode is important 
    dbfile = open('examplePickle', 'rb')      
    db = pickle.load(dbfile) 
    for keys in db: 
        print(keys, '=>', db[keys]) 
    dbfile.close() 
0
Magnus Melwin