0

Windows 7 で Python 2.7 を使用します。

サブフォルダーも調べて、パス内のファイルを見つけるための再帰関数があります。

私の問題:長時間の検索中に、 on
の値を確認したいと考えています。しかし、 「より深い」関数呼び出し/実行を中断しているため 、コードは でエラーを発生させています。retvalKeyboardInterrupt
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)
4

3 に答える 3

2

KeyboardInterrupt階層の下位にハンドラーを追加できます。

for folder in folders:
        try:
             retval += search(folder,filename)
        except KeyboardInterrupt:
               print retval
return retval

あなたが持っているようなループ内でそれがどのように処理されるかはよくわかりませんが、それをテストできます。

于 2013-02-11T13:07:16.887 に答える
1

retval のよりグローバルなコピーを保持する必要があります。機能する retval がある場合は、関数の属性を使用してそれに割り当てます。

于 2013-02-11T13:08:55.597 に答える
1

これが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 が (2 回) キャッチされた後にプログラムを終了します。

ここでのグローバル データの使用は、デモンストレーションのみを目的としています。実際には、呼び出し間の状態を維持するために、クラスを使用してインスタンス メソッドをシグナル ハンドラーに渡します。-- たとえば、次のようなものです。

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)
于 2013-02-11T13:18:26.577 に答える