subprocess.call vs os.system python

时间:2013-02-01 21:50:15

标签: python python-2.7 subprocess os.system

第一次在这里提问:

我需要在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。无法找到网络名称" 我已经为最后一个列表项尝试了很多选项而没有运气。

任何想法我可以在那里完成成功或不同的方法来映射驱动器。

1 个答案:

答案 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/")