2010-05-15 5 views
1

J'espérais obtenir de l'aide sur une question. J'ai une boucle infinie que j'ai besoin d'exécuter et j'ai besoin de mettre à jour un ensemble de variables (x dans ce cas) à des moments aléatoires de la ligne de commande. Est-ce qu'il y a un moyen de faire ça?Mise à jour de Params en Python pendant Infinite Loop

Par exemple:

x = 0 
while True: 
x = x + 1 
if x < 30: 
    do something 

et je mettre à jour la valeur de x à partir de la ligne de commande périodiquement

Répondre

0

Une fois que le programme est en cours d'exécution et à l'intérieur de cette boucle, theres aucun moyen externe pour modifier les paramètres passés dans ce programme. Ce que vous allez faire est d'avoir ce programme en cours d'exécution, et exécuter un programme séparé pour envoyer un message dans celui-ci alors qu'il est en cours d'exécution pour modifier l'état. À l'intérieur de votre boucle infinie, vous aurez besoin d'un code pour rechercher et recevoir ce message et prendre effet. Il y a beaucoup de méthodes pour effectuer cette communication. La version la plus basique serait d'interroger périodiquement un fichier à chaque itération de votre boucle infinie. Si le contenu du fichier ont changé, les lire et c'est la nouvelle valeur de X. Ensuite, pour changer la variable de la ligne de commande que vous exécutez juste une commande comme

echo "NewValue" > file.txt 

fichiers fonctionnerait ici, mais quelque chose comme des tuyaux serait être plus approprié.

2

Pour moi, il sonne comme une meilleure façon de mettre en œuvre ce serait d'utiliser un fil au lieu d'une boucle infinie et utiliser la méthode

notify() 

pour instruire quand mettre à jour avec les données de ligne de commande

Voici une bonne référence pour vous aider à démarrer:

http://docs.python.org/library/threading.html

1

Ce qui est assez hackish, mais plutôt mignon:

import code 
import signal 
import time 
def signal_handler(signal, frame): 
    code.interact(local=globals()) 
signal.signal(signal.SIGINT, signal_handler) 

x=0 
while True: 
    x = x + 1 
    time.sleep(0.01) 
    if x < 30: 
     print(x,'do something') 

Lorsque vous appuyez sur Ctrl-C, vous êtes renvoyé à l'interpréteur Python. Il vous pouvez taper des instructions Python comme

x=10 

En appuyant sur Ctrl-D reprend l'exécution.

+0

+1, solution intéressante ... –

0

Ma solution utilisant des filetages et un mécanisme de verrouillage de base.

from threading import Thread,Lock 

lock = Lock() 

def read(): 
    global x 
    x = 0 
    while True: 
     lock.acquire() 
     try: 
      x = x + 1 
     finally: 
      lock.release() 
     if x < 30: 
      #do something 


def update(): 
    global x 
    while True: 
     cmd_input = int(raw_input()) 
     lock.acquire()  
     try: 
      x = cmd_input 
     finally: 
      lock.release() 

if __name__=='__main__': 
    update_t = Thread(target=update,args=()) 
    read_t = Thread(target=read,args=()) 
    update_t.start() 
    read_t.start() 
Questions connexes