2010-04-12 28 views

cevap

9

Ben os.system kullanarak NET USE komutunu çağırarak kullanılmayan bir sürücü harfi için pay haritalama denemek istiyorum (Windows üzerinde olduğunu varsayarsak):

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

bir sürücü harfine payını eşlenen sonra, yapabilirsiniz Dosyayı belirtilen sürücüye kopyalamak için shutil.copyfile kullanın. Son olarak, pay kaldırmak olmalıdır:

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

bu sadece Windows üzerinde çalışır Tabii ve sürücü harfi P mevcut olduğundan emin olmak gerekir. Bağlantının başarılı olup olmadığını görmek için NET USE komutunun dönüş kodunu kontrol edebilirsiniz; Yoksa, başarılı olana kadar farklı bir sürücü harfi deneyebilirsiniz.

İki NET USE komutu iki yana geldiğinden ve ikincisinin her ikisi de ilk çalıştırıldığında çalıştırılmalıdır (aralarında bir istisna ortaya çıkmış olsa bile), bu iki aramayı bağlam yöneticisine daha sonra Python 2.5 veya kullandığınız:

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

Merhaba, etki alanı adı argümanı nedir? – user218976

+0

Etki alanı adı bağımsız değişkeni, kullanıcı kimliği doğrulandığında farklı bir auth etki alanı altındaysa kullanılabilir. Ben onu contextlib versiyonuna eklemedim, çünkü sadece kullanıcı adının bir parçası olabilir. Kimlik doğrulaması yapılan kullanıcı mevcut kullanıcıyla aynı alanda ise, alan ihmal edilebilir. –

+0

Teşekkürler ... işe yaradı ... sadece ikinci kez çalıştırdığımda, yerel cihazın kullanımda olduğunu söyleyen bir hata alıyorum. – user218976

2

Eğer pywin32 kütüphanesi varsa bir sürücü eşleme olmadan, o zaman, birkaç satır yapabileceğimi (örn ActiveState Python dağıtıma kısmını gelir):

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 

a more complete example on ActiveState Code