2010-04-12 169 views

Respuesta

9

que iba a tratar el mapeo de la acción a una letra de unidad no utilizada llamando el comando NET USE usando os.system (suponiendo que usted está en Windows):

os.system(r"NET USE P: \\ComputerName\ShareName %s /USER:%s\%s" % (password, domain_name, user_name)) 

Después de que asignó la cuota a una letra de unidad, puede use shutil.copyfile para copiar el archivo a la unidad especificada. Por último, se debe desmontar la proporción:

os.system(r"NET USE P: /DELETE") 

Por supuesto, esto sólo funciona en Windows, y usted tendrá que asegurarse de que la letra de la unidad P está disponible. Puede verificar el código de retorno del comando NET USE para ver si el montaje tuvo éxito; si no, puede probar una letra de unidad diferente hasta que tenga éxito.

Dado que los dos comandos NET USE vienen en pares y el segundo siempre se debe ejecutar cuando se ejecutó el primero (incluso si se generó una excepción en el medio), puede ajustar estas dos llamadas en un administrador de contexto si están usando Python 2.5 o posterior:

from contextlib import contextmanager 

@contextmanager 
def network_share_auth(share, username=None, password=None, drive_letter='P'): 
    """Context manager that mounts the given share using the given 
    username and password to the given drive letter when entering 
    the context and unmounts it when exiting.""" 
    cmd_parts = ["NET USE %s: %s" % (drive_letter, share)] 
    if password: 
     cmd_parts.append(password) 
    if username: 
     cmd_parts.append("/USER:%s" % username) 
    os.system(" ".join(cmd_parts)) 
    try: 
     yield 
    finally: 
     os.system("NET USE %s: /DELETE" % drive_letter) 

with network_share_auth(r"\\ComputerName\ShareName", username, password): 
    shutil.copyfile("foo.txt", r"P:\foo.txt") 
+0

Hola, ¿cuál es el argumento del nombre de dominio? – user218976

+0

El argumento de nombre de dominio se puede usar cuando el usuario que se está autenticando está bajo un dominio de autenticación diferente. No lo incluí en la versión contextlib porque simplemente se puede hacer parte del nombre de usuario. Si el usuario que está siendo autenticado está en el mismo dominio que el usuario actual, el dominio puede ser omitido. –

+0

Gracias ... funcionó ... solo que a veces, si lo ejecuto por segunda vez, aparece un error que indica que el dispositivo local está en uso. – user218976

2

Si usted tiene la biblioteca pywin32 (por ejemplo, viene parte de la distribución de ActiveState Python), entonces se puede lograr que se haga en unas pocas líneas, sin asignar una unidad:

import win32wnet 
win32wnet.WNetAddConnection2(0, None, '\\\\'+host, None, username, password) 
shutil.copy(source_file, '\\\\'+host+dest_share_path+'\\') 
win32wnet.WNetCancelConnection2('\\\\'+host, 0, 0) # optional disconnect 

Hay a more complete example on ActiveState Code

Cuestiones relacionadas