web-dev-qa-db-ja.com

Python 2:ドライブ文字からネットワーク共有パスを取得する

以下を使用して、接続されているすべてのドライブのリストを取得するとします。

available_drives = ['%s:' % d for d in string.ascii_uppercase if os.path.exists('%s:' % d)]

接続されたドライブのUNCパスを取得するにはどうすればよいですか?

os.pathは、z:\の代わりに\share\that\was\mapped\to\zを返すだけです。

12

ドライブ文字を変換するには、pywin32の win32wnet を使用します。例えば:

import win32wnet
import sys

print(win32wnet.WNetGetUniversalName(sys.argv[1], 1))

これを実行すると、次のようなものが得られます。

C:\test>python get_unc.py i:\some\path
\\machine\test_share\some\path
11
Peter Brittain

ctypesと、この投稿の最初の回答に示されているコードを使用して: Pythonのネットワークドライブ文字から完全なコンピューター名を取得 、すべてのネットワークドライブのドライブパスを取得することができます、または選択したいくつか。

get_connection指定された関数は、ドライブがローカルドライブまたはリムーバブルドライブのいずれかのネットワークドライブでない場合、エラーをスローします。これは、次のように説明できます。

# your drive list
available_drives = ['%s:' % d for d in string.ascii_uppercase if os.path.exists('%s:' % d)]
for drive in available_drives:
    try:
        # function from linked post
        print(get_connection(drive))
    except WindowsError: # thrown from local drives
        print('{} is a local drive'.format(drive))
3
njoosse

python≥3.4、依存関係なしでそれを行う方法は次のとおりです!*

from pathlib import Path

def unc_drive(file_path):
    return str(Path(file_path).resolve())

*注:このメソッドが失敗する状況を見つけました。私の会社のネットワーク共有の1つには、このメソッドがPermissionErrorを発生させるように権限が設定されています。この場合、 win32wnet.WNetGetUniversalNameは適切なフォールバックです。

1
Terry Davis