2012-10-04 69 views
4

我正在嘗試編寫一個可在遠程Linux服務器上移動和複製文件的Python腳本。但是,我不能認爲運行腳本的每個人(在Windows上)都會將此服務器映射到同一個字母。我不想提示用戶輸入正確的字母,而只是簡單地通過網絡URL(驅動器號映射到的網址)訪問服務器。所以,舉例來說,如果我映射服務器的URLPython:訪問具有已知URL但未知驅動器號的Windows映射網絡驅動器

\\name-of-machine.site.company.com 

要驅動S:\,我想訪問,比方說,文件S:在驅動器盤符\ VAR \ SomeFile.txt不可知的方式。我環顧四周和一般建議似乎是使用UNC表示法:

f = open(r"\\name-of-machine.site.company.com\var\SomeFile.txt", "w") 

但如果我試試這個,一個IOError說有沒有這樣的文件或目錄。如果我嘗試使用服務器的IP地址,而不是(不是真實地址,但類似):

f = open(r"\\10.1.123.149\var\SomeFile.txt", "w") 

我得到的,過了好一會,一個IO錯誤後:「無效的模式(‘W’)或文件名」。爲什麼這些符號不起作用,以及如何通過其URL訪問此服務器(理想情況下它就像本地驅動器一樣)?

+0

unc地址應該工作 - 它在我的網絡上正常工作。但是如果你沒有正確的權限,那麼你會得到一個IOError。聽起來像一個權限問題。 – MikeHunter

回答

5

不是一個非常優雅的解決方案,但你可以只是嘗試所有驅動器?

here

import win32api 

drives = win32api.GetLogicalDriveStrings() 
drives = drives.split('\000')[:-1] 
print drives 

然後,你可以每個驅動器上使用os.path.exists():\ VAR \ SomeFile.txt,直到找到合適的人。

+0

這將作爲最後的手段。雖然它(可能安全地)假設用戶已將服務器映射到某物。 – dpitch40

+0

win32api的文檔在哪裏?例如, – dpitch40

+0

[這裏](http://docs.activestate.com/activepython/2.6/pywin32/win32api.html)。 – Junuxx

0

嘗試使用短名稱而不是完全限定的名稱。在你的例子中,這將是\\name-of-machine\var\SomeFile.txt

編輯:

好吧,現在我覺得自己像個假人 - 希望你會覺得一個跟我來! ;)

機器名稱是name-of-machine.site.company.com,文件夾和文件名是\var\SomeFile.txt - 共享名稱是什麼?換句話說,你的路徑應該是這樣的:

\\name-of-machine.site.company.com\share_name\var\SomeFile.txt 
+0

不,不起作用。我從來沒有通過短名稱引用機器;將其映射爲網絡驅動器需要完全限定的名稱。完全限定名稱也是我公司Intranet上的有效URL。 – dpitch40

0

如果你可以保留此任務的驅動器盤符,並從蟒蛇有權限,則可以運行「net使用...」,然後使用該固定的驅動器號來讀取/寫入文件。

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/net_use.mspx?mfr=true

+0

我不想擔心驅動器號;是不是有一些方法可以使用我用來映射驅動器的地址訪問此服務器上的文件,而不必擔心任意驅動器號?或者我必須通過FTP或其他方式做到這一點? (甚至會工作嗎?) – dpitch40

+0

有無數其他的方式來訪問Linux服務器上的文件。例如,您可以使用DAV。 http://www.ikeepincloud.com/en/python_library但是真的有這麼多的協議和客戶端庫很難全部列出。我選擇了webdav作爲示例,因爲它完全符合您的需求,而且安裝起來非常簡單。 使用windows網絡無論如何是一場噩夢... – nagylzs

4

簡單的辦法是使用正斜槓來指定通用命名約定(UNC):

//HOST/share/path/to/file 

發現在另一個線程該解決方案,並認爲這將是與此有關。看到下面的原始線程:

Using Python, how can I access a shared folder on windows network?

+0

這幫了我一把!我在這裏嘗試了其他解決方案。 非常感謝! – CDR

+0

即使如此,從這裏豎起大拇指,它通過qoogle查詢來匹配信件。 (谷歌帶我到這裏,謝謝) - 此外,這個解決方案實際上確實解決了這裏的問題,我看不出這個問題的不同 – Henrik