2013-02-01 77 views
1

这里的第一次提问:subprocess.call vs os.system python

我需要在Windows中映射网络驱动器。该位置是内部共享点文档库。

在cmd窗口:

net use g: http://na.com/DMP/DMP/programming/ 

是全成 - >命令succeffuly完成

os.system('"net use k: http://na.com/DMP/DMP/programming/"') 

也是成功的。

但是我想用subprocess.call在事件驱动器已被映射 - 我想尝试另一个驱动器

call(["net", "use", ":q", '"http://na.com/DMP/DMP/programming/"']) 

这种失败,“系统错误67发生的网络名称。无法找到“ 我已经尝试了许多选项,为最后的列表项没有运气。

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

+4

是':q'一个错字? – bernie

+1

另外,为什么你在'subprocess'调用的URL中放置''',当你在'system'调用(和'cmd'命令行)中没有这样做时?你要求它打开URL'“http://na.com/DMP/DMP/programming/”'而不是网址'http:// na.com/DMP/DMP/programming /'。我不知道这会做什么,但是不难想象它会把它看作是以''http'开头的相对路径,或者是一个带有'http'协议的URL' – abarnert

+2

OP也引用了两次'os.system'调用@abarnert;它显然不是一个完全相同的情况,所以效果可能会不同,但它同样令人困惑 – Ben

回答

3

有在你的代码至少有两个问题:

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:开头的相对路径或协议为"http的URL或类似的东西。不管它是什么,它都不是一个可用的网络位置,这很可能会导致错误67.

正如Ben指出的,您的system调用也有类似的问题 - 您在整个字符串周围放置了一对额外的引号。如果你真的想弄明白,可能有一些原因,这个工作......但我不认为你想弄明白。只是把它当作“我做错了事,但我很幸运”,并且不要这样做。

最后,the documentation说:

在Windows上,args中,该序列被转换成可以被解析

这意味着一个字符串,如果您已经有一个工作的命令行Windows,你最好把它当作一个字符串来使用,而不是试图把它分解成subprocess的序列来重新组合。(请记住,这只适用于Windows!在其他平台上,而不是构建一个命令行字符串传递给CreateProcess系列中的函数,subprocess会生成一个字符串数组以传递给函数中的函数exec家庭)

所以,只要做到这一点:

call("net use g: http://na.com/DMP/DMP/programming/") 
+0

更正g:取得成功 - 我学到了很多东西,现在正在使用call(“net use g:http://na.com/DMP/DMP/programming/”) – user2034000

相关问题