Olá, tudo bem?
Neste post mostrarei como resolver um problema: acessar um arquivo que está na sua rede local/empresarial Windows e que usa o servidor Samba. Não é muito complicado. Vamos lá!
Neste post, vou falar do problema que tive e como resolvi. Se você só quer a solução, vá para o segundo tópico.
O problema
Eu precisava pegar alguns arquivos que estavam na rede da minha empresa (Windows e Samba) e puxá-los para o diretório do meu projeto Django, que estava num servidor Linux. Tentei o seguinte e não funcionou:
import shutil
source_path = "smb://server-name/GRUPOS/TECNOLOGIA_INFORMACAO/Dashboard Diretoria/"
dest_path = "./static/reports/". # This is my static folder where I want to move the file
file_name = "general_reports.csv"
shutil.copyfile(source_path + file_name, dest_path + file_name)
O erro que dava era o seguinte:
[Errno 2] No such file or directory: ‘smb://server-name/GRUPOS/TECNOLOGIA_INFORMACAO/Dashboard Diretoria/general_reports.csv’
Tecnologias que estava usando no momento:
- Biblioteca shutil;
- SO: MacOS e depois iria importar para o servidor Linux Ubuntu;
- Python 3.6;
- Django 2.0.5
- Rede Windows/Samba (Linux),
A solução
Para solucionar o problema, é necessário importar uma biblioteca do Python para o Samba e adicionar diversos dados. Vamos ao passo a passo:
- Instale a Biblioteca pysmb (https://pypi.org/project/pysmb/):
pip install pysmb
- Importe a biblioteca para seu código/arquivo .py:
import shutil from smb.SMBConnection import SMBConnection
- Para listar todos os arquivos de um diretório:
server_ip = "10.110.10.10" # Coloque aqui o IP do seu servidor server_name = 'myserver' # Coloque aqui o nome do seu servidor share_name = "GRUPOS" # Esse é o nome do principal diretório da rede onde você deseja conectar network_username = 'myuser' # Esse é o seu nome de usuário na rede network_password = '***' # Essa é sua senha de rede machine_name = 'myuser@mac-mc70006405' # O nome do seu computador. Para saber, acesse o terminal conn = SMBConnection(network_username, network_password, machine_name, server_name, use_ntlm_v2 = True) assert conn.connect(server_ip, 139) files = conn.listPath(share_name, "/TECNOLOGIA_INFORMACAO/Dashboard Diretoria/") # Coloque aqui o caminho completo for item in files: print(item.filename)
O código acima irá imprimir no console/terminal todos os arquivos que forem encontrados.
- Para copiar um ou mais arquivos:
# Verifica se o arquivo que queremos está lá
sf = conn.getAttributes(share_name, "general_reports.csv")
print sf.file_size # Imprime o tamanho do arquivo
print sf.filename # Imprime o nome do arquivo
# Cria um arquivo temporário para a transferência
file_obj = tempfile.NamedTemporaryFile(mode='w+t', delete=False)
file_name = file_obj.name
file_attributes, copysize = conn.retrieveFile(share_name, "general_reports.csv", file_obj)
print copysize
file_obj.close()
# Copia o arquivo temporário para o diretório que você queria
shutil.copy(file_name, "diretorio-novo/general_reports.csv")
# Fecha a conexão
conn.close()
É isso aí, espero ter ajudado!
Ajudou de mais!