2

さて、私は午後のほとんどの間これをデバッグしてきましたが、タオルを投げています。

学生の作業が終わった後、作業フォルダーをサーバーに戻す作業を自動化するのに役立つシステムを作成しようとしています。これまでのところ、すべてを把握しています。一致するサーバー フォルダーを正しく識別し、サーバー フォルダーをアーカイブ フォルダーに移動して、新しい作業をコピーして戻す間、一時的にバックアップすることができます。

しかし、私を支えているのはその最後のビットです。引数として渡されたフォルダーをサーバーにコピーする部分に到達するまで、すべてがうまく機能しています。

問題のコードは次のとおりです。

print "Match Source: " + match_src

archive_folder_name = match_src.rsplit('/', 1)[1]

print "Archive Folder Name: " + archive_folder_name

if not (os.path.isdir(os.path.join(os.path.dirname(match_src), "Archive"))):
    os.mkdir(os.path.join(os.path.dirname(match_src), "Archive"))

archive_dst = os.path.join(os.path.join(os.path.dirname(match_src), "Archive"), archive_folder_name)

print "Archived Folder Destination: " + archive_dst

# okay, archive folder has been made. Now we need to move the old
# stuff to this folder.

shutil.move(match_src, archive_dst)

# okay, archive folder is filled. Now to move the new stuff there
print "Updated Source: " + updated_folder_path

print "Destination: " + os.path.dirname(match_src)

shutil.move(updated_folder_path, os.path.dirname(match_src))

これらの print ステートメントからの出力とエラー コードは次のとおりです。

ServerReturn mwl36$ python serverreturn_main.py /Users/mwl36/Desktop/Week\ 1 
I'm on a Mac.
Path: /Users/mwl36/Desktop/Week 1
Folder: Week 1
Match Source: /Volumes/GCPSX Mac HD/ID/Marisa/Work for Student Workers/201315/SERVERTEST/Week 1
Archive Folder Name: Week 1
Archived Folder Destination: /Volumes/GCPSX Mac HD/ID/Marisa/Work for Student Workers/201315/SERVERTEST/Archive/Week 1
Updated Source: /Users/mwl36/Desktop/Week 1
Destination: /Volumes/GCPSX Mac HD/ID/Marisa/Work for Student Workers/201315/SERVERTEST
Traceback (most recent call last):
  File "serverreturn_main.py", line 124, in <module>
    main()
  File "serverreturn_main.py", line 117, in main
    shutil.move(updated_folder_path, os.path.dirname(match_src))
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 296, in move
    copytree(src, real_dst, symlinks=True)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 206, in copytree
    raise Error, errors
shutil.Error: [('/Users/mwl36/Desktop/Week 1/testfile.txt', '/Volumes/GCPSX Mac HD/ID/Marisa/Work for Student Workers/201315/SERVERTEST/Week 1/testfile.txt', "[Errno 22] Invalid argument: '/Volumes/GCPSX Mac HD/ID/Marisa/Work for Student Workers/201315/SERVERTEST/Week 1/testfile.txt'")]

どこが間違っていますか?shutil.move(src, dst) の呼び出しが最初は問題なく機能した場合、なぜここで barfing が発生するのでしょうか? 最初の呼び出しの後に遅延を追加しようとしましたが、効果はありませんでした。

編集:さらに奇妙なのは、実際に移動を実行しますが、デスクトップ上の古いフォルダーを削除することは決してないようです. 基本的に、フォルダーを DST の場所にコピーしますが、その後はクリーンアップしません。

編集 #2: os.listdir を呼び出すと、ディレクトリがなくなり、2 回目の移動呼び出しの前にそこにあるのは「アーカイブ」だけであることが示されます。明日、仕事中に copy() をテストして、コードに再びアクセスできるようにします。

4

1 に答える 1

2

shutil.move()ソースを宛先にコピーし、「単純な移動」が不可能な場合はソースを削除します。これは、ソースと宛先が同じファイルシステム上にない場合などに発生する可能性があります。

この場合、shutil.move()はまさにそれを行っています。最初にソースを宛先にコピーし、次にソースに対して armtree()を実行します。

コピー中shutilに、ソース ファイルのバイトをコピーしてから、「統計」情報 (権限、変更時間など) をコピーします。[Errno 22] Invalid argumentしたがって、バイトのコピーまたは統計データのコピーのいずれかから来ているようです。バイトをコピーするとEINVALエラーが発生する可能性はほとんどないように思われるため、最も可能性の高い説明は、「統計」データのコピーがこのエラーの原因であるということです。

これをテストするには、メイン スクリプトの先頭に次のようなものを追加します。

import shutil
import sys
import traceback

orig_copystat = shutil.copystat
def my_copystat(src, dst):
    try:
        orig_copystat(src, dst)
    except Exception as e:
        sys.stdout.write('copystat failed: %s\n' % e)
        traceback.print_exc()

shutil.copystat = my_copystat

# Your script here...

私の推測が正しければ、copystat failed: ...スクリプトを実行するとメッセージ (およびスタック トレース) が表示されますが、それ以外の場合は「機能する」はずです。上記の関数からエラー メッセージが表示された場合は、上記の関数を変更して、例外を黙って無視し、スクリプトを実行できます。それ以外の場合は、上記のようにモンキー パッチを適用して、例外が発生shutil.copyfileしている正確な場所を確認してください。copyfile()

于 2013-09-05T00:33:09.623 に答える