문제

문제점 : Shutil.Copy ()를 사용하여 Linux의 FAT16 마운트 된 파일 시스템에 파일을 복사하여 (Python 2.7.x). 실패는 shutil 내부 오류가 아니며 shutil.chmod에서 실제로 실제로 실패합니다 .Copy가 실행되는 것 같습니다.

쉘 chmod도 FAT에서 지원되지 않으므로 chmod도 실패합니다.

질문 :이 주위에 깔끔한 방법이 있습니까? 나는 몇 가지 옵션이 있다는 것을 알고 있습니다 (예 :

  1. copyfile을 사용하십시오 - 대상 디렉토리뿐 아니라
  2. 뿐만 아니라 전체 경로가 필요하지 않으므로 이상적이지 않습니다.
  3. 파일을 복사하려면 쉘 CP를 실행합니다
  4. 파일 모드를 변경하려고하지 않는 자체 복사 기능
  5. 파이썬이나 뚱뚱한 마운트 옵션 에서이 방법이 있습니까? 이제 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)
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top