Python: 如何访问已知URL但未知驱动器字母的Windows映射网络驱动器

7

我正在尝试编写一个Python脚本,可以在远程Linux服务器上移动和复制文件。然而,我不能假设运行脚本的每个人(在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访问此服务器(最好像访问本地驱动器一样)?


UNC地址应该可以使用——在我的网络上它很好用。但是如果您没有正确的权限,那么您将会收到一个IOError。听起来像是一个权限问题。 - MikeHunter
4个回答

7

即便如此,我在这里点赞,它完全符合我的谷歌查询。另外,这个解决方案确实解决了这个问题,我看不出这个问题有什么不同。 - Henrik

5

这不是一个十分优雅的解决方案,但你可以尝试所有的驱动器?

参考 这里

import win32api

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

然后您可以在每个驱动器上使用os.path.exists(),直到找到正确的驱动器为止。


那将作为最后的手段。虽然它(可能是安全的)假设用户已经将服务器映射到某个位置。 - dpitch40
win32api 的文档在哪里? - dpitch40
例如,在这里(http://docs.activestate.com/activepython/2.6/pywin32/win32api.html)。 - Junuxx
我可能需要使用这个。有没有办法检查每个字母映射到的地址? - dpitch40

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

不行,这样做不起作用。我从来没有使用短名称引用机器;将其映射为网络驱动器需要完全限定的名称。完全限定的名称也是我公司内部网的有效URL。 - dpitch40

0

我不想担心驱动器字母;有没有一种方法可以使用我在第一次映射驱动器时使用的地址访问此服务器上的文件,而不必担心任意的驱动器字母?或者我必须通过FTP之类的方式来完成它吗?(那样会起作用吗?) - dpitch40
在Linux服务器上访问文件的方法有无数种。例如,您可以使用DAV。http://www.ikeepincloud.com/en/python_library 但实际上有很多协议和客户端库,很难列举出所有的。我选择WebDAV作为示例,因为它正好符合您的需求,并且易于安装。无论如何,使用Windows网络都是一场噩梦... - nagylzs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接