好吧,所以我在整个下午的大部分时间里一直在调试此程序,这是我的全部工作。

我正在尝试创建一个系统,该系统将帮助我的学生工作人员完成工作文件夹后自动将工作文件夹放回到服务器上。到目前为止,我已经掌握了所有内容,它可以正确识别出匹配的服务器文件夹,并且能够将服务器文件夹移到“存档”文件夹中,以便在我将新工作复制回来时将其临时备份。

但是,正是最后一点使我受阻。一切运行良好,直到我到达将作为参数传递的文件夹复制回服务器的那一部分。

这是有问题的代码:

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))


这是这些打印语句的输出以及错误代码:

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)的调用在第一次运行时没有问题,为什么在这里bar倒呢?我尝试在初始通话后添加延迟,但没有任何效果。

编辑:什至更陌生的是它将实际上执行移动,但似乎从未删除桌面上的旧文件夹。本质上,它会将文件夹复制到DST位置,但不会自动清除。

编辑#2:调用os.listdir显示目录已消失,并且在第二个移动调用之前唯一的目录是“存档”。明天上班时,我将测试copy()并再次访问该代码。

最佳答案

shutil.move()会将源复制到目标,如果无法“简单移动”,则将其删除。例如,当源和目标不在同一文件系统上时,可能会发生这种情况。

在这种情况下,shutil.move()就是这样做的:首先它将源复制到目标,然后在源上执行rmtree()

在复制过程中,shutil将复制源文件的字节,然后复制“ stat”信息(权限,修改时间等)。因此,似乎[Errno 22] Invalid argument来自复制字节或复制统计数据。复制字节似乎不太可能引起EINVAL错误,因此最可能的解释是复制“ stat”数据会导致此错误。

您可以通过在主脚本的开头添加如下内容来进行测试:

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()中确切的位置出现了异常。

关于python - Errno 22具有Python shutil和.move()函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18621577/

10-12 21:50