[英]What is the best way to repeatedly execute a function every few seconds, without intterupting other functions, for a Python gui?
[英]Python - Print a value without intterupting a loop/function
在Windows 7上使用Python 2.7。
我有一個遞歸函數,可以在路徑中查找文件,也可以在子文件夾中查找。
我的問題:
在長時間搜索期間,我希望在KeyboardInterrupt
上看到retval
的值。
但是代碼在KeyboardInterrupt
上引發了錯誤,因為它正在中斷“更深層的”函數調用/運行。
我的問題:
有什么方法可以不中斷循環,但仍然可以打印出值,
要么
一種不同的方式來執行相同的操作(即不使用KeyboardInterrupt
而是使用其他方法)
我的代碼:
import os
def search(path,filename):
try:
global found
folders = []
retval = []
try:
for item in os.listdir(path):
if not os.path.isfile(os.path.join(path, item)):
folders.append(os.path.join(path, item))
else:
if item == filename:
found += 1
retval.append(os.path.join(path, item))
except WindowsError,e:
print str(e)[10:]
for folder in folders:
retval += search(folder,filename)
return retval
except KeyboardInterrupt:
print retval
found = 0
path = 'C:\\'
filename = 'test.txt'
print search(path,filename)
您可以在層次結構中的下方添加KeyboardInterrupt
處理程序:
for folder in folders:
try:
retval += search(folder,filename)
except KeyboardInterrupt:
print retval
return retval
您可以測試一下,盡管我不太確定在循環中如何處理像您這樣的循環。
您需要保留一個更全面的retval副本,我將使用該函數的屬性,並在您擁有適合您的retval時將其分配給它。
我不確定如何或是否可以在Windows上運行,但是在Unix下,您可以執行以下操作:
import signal
import sys
count = 0
def handler(signum,frame):
global count
print "Value of 'i' is",i
count += 1
if count >= 2:
sys.exit(0)
signal.signal(signal.SIGINT,handler)
i = 0
while True:
i += 1
在這里,我在捕獲ctrl-C之后(兩次)退出了程序,因為我沒有其他退出程序的好方法。
這里使用全局數據僅出於演示目的-在野外,我將使用一個類並將實例方法傳遞給信號處理程序,以維護兩次調用之間的狀態。 -例如:
import signal
class Reporter(object):
def __init__(self):
self.retval = []
def handler(self,signum,frame):
print self.retval
r = Reporter()
signal.signal(signal.SIGINT,r.handler)
然后,只要您輸入/退出函數,就可以重新綁定self.retval
:
import os
def search(path,filename):
global found
folders = []
retval = []
r.retval = retval #<--- Line added
try:
for item in os.listdir(path):
if not os.path.isfile(os.path.join(path, item)):
folders.append(os.path.join(path, item))
else:
if item == filename:
found += 1
retval.append(os.path.join(path, item))
except WindowsError,e:
print str(e)[10:]
for folder in folders:
retval += search(folder,filename)
r.retval = retval #<---- Line added
return retval
found = 0
path = 'C:\\'
filename = 'test.txt'
print search(path,filename)
我想我更喜歡使用os.walk
的非遞歸解決方案:
import os
def search(path,filename):
retval = []
r.retval = retval
for (dirpath, dirnames, filenames) in os.walk(path):
retval.extend(os.path.join(path,dirpath,item) for item in filenames if item == filename)
return retval
path = 'C:\\'
filename = 'test.txt'
print search(path,filename)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.