2010-05-15 51 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()