2016-01-14 38 views
7

私はpythonを使用して、多数の格納ファイルのファイルパスをテーブルに取り込みます。しかし経路は、だけでなく、ドライブ文字の完全なネットワークドライブのコンピュータ名を持っている必要がありますすなわちpythonのネットワークドライブ文字から完全なコンピュータ名を取得

//コンピュータ名/フォルダ/サブフォルダ/ファイル

ない

P:/フォルダ/サブフォルダ/ファイル

私はwin32api、win32file、およびos.pathモ​​ジュールを使用して調査しましたが、何もできないように見えます。 win32api.GetComputerName()のようなものが必要ですが、既知のドライブ文字を引数としてドロップすることができ、文字にマップされているコンピュータ名が返されます。

とにかくドライブレターを検索してコンピュータ名を取得するためにPythonにはありますか?

答えて

-1

あなただけのホスト名が必要な場合は、socketモジュールを使用することができます

socket.gethostname() 

か、osモジュールを使用することもできます。

os.uname()[1] 

os.uname()は(が含まれている5タプルを返しますsysname、ノード名、リリース、バージョン、マシン)

+0

ということで 'socket.gethostname()' 'win32api.GetComputerName(とまったく同じことを行うように見えます)'ローカルコンピュータの名前を返します。マップされたネットワークドライブの名前を返すために必要です。 '.uname'は' os'モジュール内のオブジェクトとして存在しません。 – Cjd111

+0

私は 'uname'はlinux/unixシステムでのみ利用可能だと思います。ローカルコンピュータ名も返されます。 – linluk

5

ネットワークドライブは、mpr.dll(複数のプロバイダルータ)によってエクスポートされたWindows Networking APIを使用してマップされます。 WNetAddConnection2経由でネットワークドライブを作成できます。ローカルデバイスに関連付けられているリモートパスを取得するには、WNetGetConnectionに電話してください。次のように、この使用してctypesの操作を行うことができます。たとえば

import ctypes 
from ctypes import wintypes 

mpr = ctypes.WinDLL('mpr') 

ERROR_SUCCESS = 0x0000 
ERROR_MORE_DATA = 0x00EA 

wintypes.LPDWORD = ctypes.POINTER(wintypes.DWORD) 
mpr.WNetGetConnectionW.restype = wintypes.DWORD 
mpr.WNetGetConnectionW.argtypes = (wintypes.LPCWSTR, 
            wintypes.LPWSTR, 
            wintypes.LPDWORD) 

def get_connection(local_name): 
    length = (wintypes.DWORD * 1)() 
    result = mpr.WNetGetConnectionW(local_name, None, length) 
    if result != ERROR_MORE_DATA: 
     raise ctypes.WinError(result) 
    remote_name = (wintypes.WCHAR * length[0])() 
    result = mpr.WNetGetConnectionW(local_name, remote_name, length) 
    if result != ERROR_SUCCESS: 
     raise ctypes.WinError(result) 
    return remote_name.value 

>>> subprocess.call(r'net use Y: \\live.sysinternals.com\tools') 
The command completed successfully. 
0 
>>> print(get_connection('Y:')) 
\\live.sysinternals.com\tools 
0

私はあなただけpywin32 ...あなたがhereを見ることができるようにより多くのを見てする必要があると思う、すでにそこにありますローカルドライブ名を完全なUNCパスに変換するAPI。

完全性のために、私のために働くいくつかのコードはここにあります。

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 
関連する問題