Python shutil.cópia de falha em sistemas de arquivos FAT (Ubuntu)
Pergunta
Problema:Usando shutil.(cópia) para copiar um arquivo para um FAT16 montado sistema de arquivos no Linux falhar (Python 2.7.x).A falha é shutil erro interno, e na falta, na verdade, na shutil.chmod, que shutil.copie parece estar a executar.
Shell chmod falha, também, as permissões não são suportados em GORDURA.
Perguntas:Existe alguma forma elegante de contornar isso?Eu sei que tem várias opções, por exemplo:
- Use copyfile, não é o ideal, pois ela requer o caminho completo, não apenas o diretório de destino, mas factível
- Executar o shell cp para copiar arquivos
- Escrever a própria função de cópia que não tenta alterar o ficheiro de modos de
Existe uma maneira de contornar isso em Python OU em GORDURA opções de montagem?Eu agora montar o sistema de arquivos dentro do meu programa executando o comando mount-t vfat -o umask=000 /dev/loop0 /mnt/foo
Captura a exceção não ajuda, como a exceção acontece dentro shutil.copie e shutil.(cópia) parece excluir o arquivo de destino quando ele pega IOException de shutil.chmod(), antes de passar IOException para a função chamada.
Quaisquer ideias, ou devo apenas escolher um de 1-3?
Hannu
Solução
Bem, eu fraude neste caso.
Se eu sei que o destino é um arquivo de sistema, onde chmod
falhará, eu simplesmente apagar o chmod
método do pacote usando os del os.chmod
, e isto permite a cópia para o sucesso.
>>> import os
>>> print hasattr(os, 'chmod')
True
>>> foo = os.chmod
>>> del os.chmod
>>> print hasattr(os, 'chmod')
False
Isso permite que você para realizar a cópia sem falhar em o chmod.Então nós reativá-lo, atribuindo-se o atributo de volta.
>>> setattr(os, 'chmod', foo)
>>> print hasattr(os, 'chmod')
True
Outras dicas
Utilização shutil.copyfile
, que não requer o caminho completo.
Apagar os.chmod
globalmente é não uma boa idéia.
$ 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 ./
Como você pode ver no python de código fonte de shutil (/usr/lib/python2.7/shutil.py
), não há nenhum caminho consideração (relativo/absoluto) no copy
o código-fonte, o src
variável é diretamente transmitido como um argumento de 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)