2010-05-15 46 views
1

我希望在问题上得到一些帮助。我有一个无限循环,我需要运行,我需要从命令行随机更新一组变量(本例中为x)。有没有办法做到这一点?在无限循环中更新Python中的参数

例如:

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

和我需要更新从周期性

回答

0

一旦程序正在运行,并且循环内的命令行X的值,那里有外部无法修改传递的参数纳入该计划。你将要做的就是运行这个程序,并运行一个独立的程序来发送消息到这个程序中,同时运行它来修改状态。在你的无限循环内,你将需要有代码来寻找并接收该消息并生效。有很多方法可以执行此通信。最基本的版本是定期轮询一个文件,在无限循环中进行这么多迭代。如果文件内容发生了变化,在阅读和那X的新值,然后给变量在命令行中改变你只要运行如下命令

echo "NewValue" > file.txt 

文件将在这里工作,但像管会更合适。

2

对我来说,这听起来像一个更好的方式来实现,这将是使用一个线程,而不是一个无限循环和使用

notify() 

方法指导时在命令行的数据来更新

这里是一个很好的参考,让你开始:

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

1

这是相当的hackish,但也有点可爱:

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') 

当你按下Ctrl-C时,你被放到python解释器中。 在那里你可以键入Python语句,如

x=10 

按Ctrl-D恢复执行。

+0

+1,有趣的解决方案... – 2010-05-15 18:07:22

0

我的解决方案使用线程和基本的锁定机制。

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()