第一次提问:
我需要在 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。找不到网络名称” 我为最后一个列表项尝试了很多选项,但没有成功。
知道我可以在其中填充什么以成功完成此操作,或者使用不同的方法来映射驱动器。
最佳答案
您的代码中至少存在两个问题:
call(["net", "use", ":q", '"http://na.com/DMP/DMP/programming/"'])
首先,您的意思是 "q:"
处的 ":q"
。这可能会导致 net
命令将 :q
解释为您的网络位置而不是目标驱动器,从而可能导致错误 67。
其次,URL 周围有一组额外的引号:'"http://na.com/DMP/DMP/programming/"'
,您应该在其中使用 'http://na.com/DMP/DMP/programming/'
。当 subprocess
构建要传递给 CreateProcess
的字符串时,它已经引用了您的每个参数。因此,如果您自己引用它们,最终会双引号参数。在某些情况下,这在 Windows 中实际上是不可能的,因此最终会得到垃圾,但我认为这里不是这种情况。您将成功将此带引号的字符串发送给 net
,告诉它您要打开以 "http:
开头的相对路径或协议(protocol)为 "http 的 URL
,或者类似的东西。不管它是什么,它都不是可用的网络位置,这很可能会导致错误 67。
正如 Ben 指出的,您的系统
调用也有类似的问题——您在整个字符串周围放置了一对额外的引号。如果你真的想弄清楚,这可能有一些原因……但我认为你不想弄清楚。就当“我做错了,但我幸运”吧,以后不要再这样做了。
最后,如the documentation说:
On Windows, an args sequence is converted to a string that can be parsed
这意味着,如果您已经有一个适用于 Windows 的工作命令行,那么最好将其用作字符串,而不是尝试将其分解为一个序列以供 subprocess
重新组装.
(请记住,这仅适用于 Windows!在其他平台上,subprocess
不是构建命令行字符串来传递给 CreateProcess
系列中的函数,而是构建一个数组传递给 exec
系列中的函数的字符串。)
所以,只需这样做:
call("net use g: http://na.com/DMP/DMP/programming/")
关于python - subprocess.call 与 os.system python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14655629/