第一次在这里提问:
我需要在Windows中映射网络驱动器。该位置是一个内部共享点文档库。
在cmd窗口中:
net use g: http://na.com/DMP/DMP/programming/
是成功的 - >命令已成功完成
os.system('"net use k: http://na.com/DMP/DMP/programming/"')
也很成功。
但是我想在已经映射驱动器的情况下使用subprocess.call - 我想尝试另一个驱动器
call(["net", "use", ":q", '"http://na.com/DMP/DMP/programming/"'])
这失败了"发生了系统错误67。无法找到网络名称" 我已经为最后一个列表项尝试了很多选项而没有运气。
任何想法我可以在那里完成成功或不同的方法来映射驱动器。
答案 0 :(得分:3)
您的代码中至少存在两个问题:
call(["net", "use", ":q", '"http://na.com/DMP/DMP/programming/"'])
首先,您的":q"
代表"q:"
。这可能会导致net
命令将:q
解释为您的网络位置而不是目标驱动器,这可能会导致错误67.
其次,您在网址周围有一组额外的引号:'"http://na.com/DMP/DMP/programming/"'
您应该使用'http://na.com/DMP/DMP/programming/'
。当subprocess
构建要传递给CreateProcess
的字符串时,它已经引用了每个参数。所以,如果你自己引用它们,你最终会双重引用这些参数。在某些情况下,这在Windows中实际上是不可能的,所以你最终会得到垃圾,但我认为这不是这种情况。您将成功将此引号字符串设置为net
,告诉您要打开以"http:
开头的相对路径或带有协议"http
的URL,或类似的内容。无论是什么,它都不是一个可用的网络位置,很可能会导致错误67。
正如Ben指出的那样,你的system
调用有类似的问题 - 你在整个字符串周围放了一对额外的引号。如果你真的想弄清楚,可能有一些原因可以解决这个问题...但我认为你不想弄明白。只是把它当作“我做错了,但我很幸运”,并且不要在将来这样做。
最后,正如the documentation所说:
在Windows上,args序列转换为可以解析的字符串
这意味着,如果您已经拥有适用于Windows的工作命令行,那么最好只将其用作字符串,而不是尝试将其分解为subprocess
重新组合的序列。
(请记住,这仅适用于Windows!在其他平台上,subprocess
不是构建命令行字符串以传递给CreateProcess
系列中的函数,而是构建字符串数组传递给exec
系列中的函数。)
所以,就这样做:
call("net use g: http://na.com/DMP/DMP/programming/")