我正在尝试编写一个可以在远程Linux服务器上移动和复制文件的Python脚本。但是,我不能假设每个运行脚本的人(在Windows上)都会将此服务器映射到同一个字母。我想通过其网络URL(驱动器号映射到的网络URL)来访问服务器,而不是提示用户输入正确的字母。因此,例如,如果我已映射服务器的URL
\\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 :(得分:5)
不是一个非常优雅的解决方案,但你可以试试所有的驱动器吗?
来自here:
import win32api
drives = win32api.GetLogicalDriveStrings()
drives = drives.split('\000')[:-1]
print drives
然后你可以在每个驱动器上使用os.path.exists()
:\ var \ SomeFile.txt,直到找到合适的驱动器。
答案 1 :(得分:5)
简单的解决方案是使用正斜杠来指定通用名称约定(UNC):
//HOST/share/path/to/file
在另一个帖子中找到了这个解决方案,觉得它在这里是相关的。请参阅下面的原始主题:
Using Python, how can I access a shared folder on windows network?
答案 2 :(得分: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
答案 3 :(得分:0)
如果您可以为此任务保留驱动器号,并且您具有权限,则可以从python运行“net use ...”,然后使用该固定驱动器号来读取/写入文件。
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/net_use.mspx?mfr=true