簡體   English   中英

Python-打印值而不會插入循環/函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM