3

この関数が追加の「。」を出力しようとしています。大きなフォルダ(〜3GB)をある場所から別の場所にコピーしている間、毎秒:

def copy_folder(source, destination):
    print 'copying',
    while shutil.copytree(src=source, dst=destination):
        print '.',
        time.sleep(1)

しかし、関数を呼び出すと:

source = 'source_folder'
destination = 'destination_folder'
copy_folder(source=source, destination=destination)

フォルダ全体を完全に正常にコピーしていますが、「。」は出力されません。まったく。

スレッドを使用する必要がありますか?

4

4 に答える 4

4

Python でのスレッド化は非常に単純です。

import sys, shutil, time, threading

class CopyThread(threading.Thread):
    def __init__(self, source, destination):
        super(CopyThread, self).__init__()

        self.source = source
        self.destination = destination

    def run(self):
        time.sleep(5)  # Delete me later on, I'm just here to slow things down
        return shutil.copytree(src=self.source, dst=self.destination)

if __name__ == '__main__':
    thread = CopyThread('source_folder', 'destination_folder')
    thread.start()

    while thread.is_alive():
        sys.stdout.write('.')
        sys.stdout.flush()

        time.sleep(1)

    thread.join()

サブクラス化threading.Threadしてオーバーライドするだけrun()です。その後、.start()そのクラスのインスタンスを呼び出すと、スレッドが作成されます。

于 2012-08-21T02:42:57.483 に答える
1

copytree はツリー全体をコピーするため、コピーが完了して戻り値が評価されるまで while ループは実行されません。

私のpythonはさびていますが、スレッドを実装する方法のアイデアを提供します(ここにあるコードに触発されました)。

def copy_folder(source, destination):
    self.iscopying = True        
    self.thread = threading.Thread(name="GPS Data", target=self.thread_run)
    self.thread.setDaemon(True)
    self.thread.start()
    shutil.copytree(src=source, dst=destination)
    self.iscopying = false


def thread_run(self):
    while self.iscopying:
        print '.'
        time.sleep(1)

基本的に、コピーが行われているときにスレッドに通知するフラグを作成し、コピーが完了したら false に設定します。

于 2012-08-21T02:28:27.700 に答える
1

copytree のソース コードを見ると、その核心は次のループです。

for name in names:
   if name in ignored_names:
       continue
   srcname = os.path.join(src, name)
   dstname = os.path.join(dst, name)
   try:
       if symlinks and os.path.islink(srcname):
           linkto = os.readlink(srcname)
           os.symlink(linkto, dstname)
       elif os.path.isdir(srcname):
           copytree(srcname, dstname, symlinks, ignore)
       else:
           # Will raise a SpecialFileError for unsupported file types
           copy2(srcname, dstname)
   # catch the Error from the recursive copytree so that we can
   # continue with other files
   except Error, err:
       errors.extend(err.args[0])
   except EnvironmentError, why:
       errors.append((srcname, dstname, str(why)))

最後に権利を追加するyieldと、ループは機能しますが、時間間隔ではなく、ファイルまたはディレクトリがコピーされるたびに印刷されます(time.sleepコピー間で発生し、全体に少し時間がかかります;時間間隔ごとに、はい、スレッドが必要になります)。ただし、これにより、より詳細なフィードバックを提供することもできます。たとえば、どのファイルがコピーされたかについてのフィードバックを印刷することができますyield name(または、 )。yield (srcname, destname)

于 2012-08-21T02:47:47.707 に答える
0

これを非同期で行うモジュールを知りません...モジュールがないわけではありません...しかし、フォルダーを再帰的に調べて、「。」を出力できます。各ファイル/フォルダーの後

于 2012-08-21T02:36:10.197 に答える