Ir ao conteúdo
  • Cadastre-se

Python Método de cópia mais rápido para ambos os S.O?


Posts recomendados

senhores, tudo bem?

estou implementando um método de classe pequena, e me deparei com uma dúvida, qual a forma mais otimizada de cópia para windows e linux? principalmente windows.

seria essa?

 

    def try_copy(self, src: str, dst: str, max_attempts: int = 3) -> bool:
        attempts = 0
        while attempts < max_attempts:
            try:
                if system() == 'Windows':
                    call(["robocopy", src, dst, "/MT:16", "/J", "/NP"])
                else:
                    call(["rsync", "-a", src, dst])
                print(f"""
                ⇘\tsuccessfully transferred\n
                """)
                return True
            except Exception as e:
				...
        return False

 

ou essa?

    def try_copy(self, src: str, dst: str, max_attempts: int = 3) -> bool:
        attempts = 0
        while attempts < max_attempts:
            try:
            O_BINARY = os.O_BINARY
            except:
            O_BINARY = 0

            READ_FLAGS = os.O_RDONLY | O_BINARY
            WRITE_FLAGS = os.O_WRONLY | os.O_CREAT | os.O_TRUNC | O_BINARY
            BUFFER_SIZE = 128*1024

            fin = os.open(src, READ_FLAGS)
            stat = os.fstat(fin)
            fout = os.open(dst, WRITE_FLAGS, stat.st_mode)
            for x in iter(lambda: os.read(fin, BUFFER_SIZE), ""):
            os.write(fout, x)
                return True
            except Exception as e:
				...
        return False

 

Link para o comentário
Compartilhar em outros sites

A primeira vai depender do algoritmo implementado por cada sistema, já que você está chamando comandos do sistema. Na minha opinião ela deve ser a mais rápida, já que a segunda é implementada apenas em Python e a linguagem é conhecida por ser lenta.

Se você quiser, pode usar também a função copy da lib shutil. Ou olhar a implementação: https://github.com/python/cpython/blob/main/Lib/shutil.py#L230

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@Kamuri Bom dia mestre kamuri.
Então.. o codigo original tem mais de 300 linhas e não tem muita relação com a dúvida.
O robocopy foi o mais rápido até o momento, porém ele produz muito texto no console, e como eu faço a transferência usando ThreadPoolExecutor, acaba que fica um emaranhado de texto no console. (mas isso não vem à duvida)

 

coloquei como função, espero que ajude.

from os.path import basename, dirname
from subprocess import call
from shutil import copy, copy2, copyfile

def try_copy(src: str, dst: str, max_attempts: int = 3) -> bool:
  attempts = 0
  while attempts < max_attempts:
    try:
      if system() == 'Windows':      
        name = basename(src)
        src = dirname(src)
        #copy(src,dst)
        #copy2(src,dst)
        #copyfile(src,dst)
        call(["robocopy", src, dst, name, "/MT:16", "/J", "/np", "/njh", "/njs", "/nc", "/eta"])
      else:
        call(["rsync", "-a", src, dst])
      return True
    except Exception as e:
      attempts += 1
      print(f"Attempt {attempts} to copy {src} to {dst} failed: {e}")
  print(f"""Failed to copy {src} to {dst} after {max_attempts} attempts.
  return False

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!