Python:访问具有已知URL但未知驱动器号的Windows映射网络驱动器

Python:访问具有已知URL但未知驱动器号的Windows映射网络驱动器,python,Python,我正在尝试编写一个Python脚本,可以在远程Linux服务器上移动和复制文件。但是,我不能假设(在Windows上)运行脚本的每个人都将此服务器映射到同一个字母。我不想提示用户输入正确的盘符,我只想通过服务器的网络URL(驱动器盘符映射到的URL)访问服务器。例如,如果我映射了服务器的URL \\name-of-machine.site.company.com 要成为驱动器S:\,我想以不知道驱动器号的方式访问文件S:\var\SomeFile.txt。我环顾四周,一般建议使用UNC符号:

我正在尝试编写一个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")
但如果我尝试这个,一个IOR错误,说没有这样的文件或目录。如果我尝试改用服务器的IP地址(不是实际地址,但类似):


在长时间暂停后,我得到一个IO错误:“无效模式('w')或文件名”。为什么这些符号不起作用,我如何通过其URL访问此服务器(理想情况下,就像它是本地驱动器一样)?

尝试使用短名称而不是完全限定的名称。在您的示例中,这将是
\\name of machine\var\SomeFile.txt

编辑:

好吧,现在我觉得自己像个哑巴——希望你和我在一起时也会觉得自己像个哑巴!;)

机器名是machine.site.company.com的
名称
,文件夹和文件名是
\var\SomeFile.txt
——共享名是什么?换句话说,您的路径应该类似于:

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

如果您可以为此任务保留一个驱动器号,并且您拥有该权限,那么您可以从python运行“net use…”,然后使用该固定驱动器号来读/写文件


这不是一个非常优雅的解决方案,但您可以试试所有的驱动器吗

发件人:


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

简单的解决方案是使用前斜杠指定通用名称约定(UNC):

在另一个线程中找到此解决方案,并认为它与此处相关。请参见下面的原始线程:


我根本不想担心驱动器号;难道没有什么方法可以使用我最初用来映射驱动器的地址访问此服务器上的文件,而不用担心任意的驱动器号吗?还是我必须通过FTP或其他方式来完成?(这还能用吗?)在linux服务器上访问文件还有无数其他方法。例如,您可以使用DAV。但实际上有太多的协议和客户端lib,很难将它们全部列出。我选择webdav作为示例,因为它完全满足您的需要,并且易于安装。无论如何,使用windows网络是一场噩梦……不,不起作用。我从不通过短名称引用机器;将其映射为网络驱动器需要完全限定的名称。完全限定名也是我公司内部网上的一个有效URL。这是最后的办法。虽然它确实(可能安全地)假设用户已将服务器映射到某个对象。例如,win32api?的文档在哪里。我可能不得不使用它。有没有办法检查每个字母映射到的地址?unc地址应该可以工作——它在我的网络上可以正常工作。但是如果您没有正确的权限,那么您将得到一个IOError。听起来像是权限问题。尽管如此,从这里竖起大拇指,它与qoogle查询匹配。(谷歌把我带到这里,谢谢)-而且,这个解决方案实际上解决了这里的问题,我看不出这个问题有什么不同
\\name-of-machine.site.company.com\share_name\var\SomeFile.txt
import win32api

drives = win32api.GetLogicalDriveStrings()
drives = drives.split('\000')[:-1]
print drives
//HOST/share/path/to/file