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:

  1. Use copyfile, não é o ideal, pois ela requer o caminho completo, não apenas o diretório de destino, mas factível
  2. Executar o shell cp para copiar arquivos
  3. 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

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top