파이썬 shutil.copy fat 파일 시스템 (우분투)에서 실패합니다.
문제
문제점 : Shutil.Copy ()를 사용하여 Linux의 FAT16 마운트 된 파일 시스템에 파일을 복사하여 (Python 2.7.x). 실패는 shutil 내부 오류가 아니며 shutil.chmod에서 실제로 실제로 실패합니다 .Copy가 실행되는 것 같습니다.
쉘 chmod도 FAT에서 지원되지 않으므로 chmod도 실패합니다.
질문 :이 주위에 깔끔한 방법이 있습니까? 나는 몇 가지 옵션이 있다는 것을 알고 있습니다 (예 :
- copyfile을 사용하십시오 - 대상 디렉토리뿐 아니라 뿐만 아니라 전체 경로가 필요하지 않으므로 이상적이지 않습니다.
- 파일을 복사하려면 쉘 CP를 실행합니다
- 파일 모드를 변경하려고하지 않는 자체 복사 기능
파이썬이나 뚱뚱한 마운트 옵션 에서이 방법이 있습니까? 이제 MOUNT -T -T VFAT -O UMASK= 000 / dev / loop0 / mnt / foo
을 실행하여 내 프로그램 내에 파일 시스템을 마운트합니다.예외를 잡는 것은 shutil.copy 및 shutil.copy ()에서 예외가 발생하지 않기 때문에 IoException을 호출 함수에 전달하기 전에 shutil.chmod ()에서 IoException을 캡처 할 때 대상 파일을 삭제하는 것으로 보입니다.
어떤 아이디어가 있거나, 1-3에서 하나를 선택해야합니까?
Hannu
해결책
이 경우에 속임수를줍니다.
대상이 chmod
가 실패한 파일 시스템 인 파일 시스템 인 경우, chmod
를 사용하여 OS 패키지에서 del os.chmod
메소드를 삭제하기 만하면 복사본이 성공할 수 있습니다.
>>> import os
>>> print hasattr(os, 'chmod')
True
>>> foo = os.chmod
>>> del os.chmod
>>> print hasattr(os, 'chmod')
False
.
이제 chmod에서 실패하지 않고 복사본을 수행 할 수 있습니다.그런 다음 특성을 다시 할당하여 다시 활성화합니다.
>>> setattr(os, 'chmod', foo)
>>> print hasattr(os, 'chmod')
True
. 다른 팁
shutil.copyfile
를 사용하면 전체 경로가 필요하지 않습니다.
os.chmod
삭제는 좋은 아이디어가 아닙니다.
$ mkdir folder
$ touch folder/a
$ python2.7 -c 'import shutil; shutil.copyfile("folder/a","folder/b")'
$ ls -rthla folder/
total 0
drwxr-xr-x+ Apr 17 12:49 ../
-rw-r--r-- Apr 17 12:49 a
-rw-r--r-- Apr 17 12:50 b
drwxr-xr-x+ Apr 17 12:50 ./
.
Python 소스 코드의 Shutil (/usr/lib/python2.7/shutil.py
)에서 볼 수 있듯이 copy
소스 코드에서 경로 고려 사항 (상대 / 절대)이 없으므로 src
변수는 copyfile
의 인수로 직접 전달됩니다.
def copy(src, dst):
"""Copy data and mode bits ("cp src dst").
The destination may be a directory.
"""
if os.path.isdir(dst):
dst = os.path.join(dst, os.path.basename(src))
copyfile(src, dst)
copymode(src, dst)
.