subprocess.call与os.system python
第一次提问: 我需要在windows中映射网络驱动器。该位置是内部sharepoint文档库 在cmd窗口中:subprocess.call与os.system python,python,python-2.7,subprocess,os.system,Python,Python 2.7,Subprocess,Os.system,第一次提问: 我需要在windows中映射网络驱动器。该位置是内部sharepoint文档库 在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", "
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
解释为您的网络位置,而不是目标驱动器,这可能会导致错误
其次,在URL周围有一组额外的引号:”http://na.com/DMP/DMP/programming/“'
您应该在哪里使用”http://na.com/DMP/DMP/programming/“
。当子流程
生成要传递给CreateProcess
的字符串时,它已经引用了您的每个参数。因此,如果您自己引用这些参数,那么最终会重复引用这些参数。在某些情况下,这在Windows中实际上是不可能的,因此最终会产生垃圾,但我认为这里的情况并非如此。您将成功地将这个带引号的字符串发送到net
,告诉它您想要打开一个以“http:
开头的相对路径或者一个协议为“http
的URL,或者类似的东西。不管它是什么,它都不是一个可用的网络位置,这很可能会导致错误
正如Ben指出的,您的系统
调用也有类似的问题,您在整个字符串周围加了一对引号。如果你真的想弄明白,这可能是有原因的…但我认为你不想弄明白。只要把它当作“我做了错事,但我很幸运”,以后不要这样做
最后,正如所说:
在Windows上,args序列被转换为可以解析的字符串
这意味着,如果您已经有了一个适用于Windows的命令行,那么最好将其作为字符串使用,而不是尝试将其分解为一个序列,以便子流程重新组装
(请记住,这仅适用于Windows!在其他平台上,subprocess
构建字符串数组以传递给exec
系列中的函数,而不是构建命令行字符串以传递给该系列中的函数。)
所以,只要这样做:
call("net use g: http://na.com/DMP/DMP/programming/")
另外,当您在系统调用(和cmd
命令行)中没有这样做时,为什么要在子流程调用中的URL周围放置http://na.com/DMP/DMP/programming/“
而不是URLhttp://na.com/DMP/DMP/programming/
。我不知道这会做什么,但不难想象它会把它当作,比如说,一个以http:
开头的相对路径,或者一个带有http
协议的URL;这显然不是一个相同的情况,因此效果可能不同,但同样令人困惑。@Ben:你说得对!显然效果是不同的,考虑到其中一个有效,另一个无效,但是的,它们都令人困惑,我不想实际弄清楚(根据各种窗口中的神秘和半文档化的引用规则)为什么一个有效而另一个无效…还有一件事:比如说,在Windows上,args序列被转换为可以使用以下规则解析的字符串“。在Unix上,你几乎总是想要一个序列而不是字符串,但在Windows上,如果你已经有了一个可以作为字符串使用的命令行,就把它作为字符串使用。我还注意到,你是cmd窗口中的第一个命令,试图使用g驱动器,而其他命令是k:和q:(某种程度上)。您是否100%确定其他网络共享尚未使用这些功能?例如,在添加共享之前,使用net use k:/d
,可能更明智,但这取决于您运行此操作的框中没有与k:的打开连接。对g:的更正取得了成功-我学到了很多,现在正在使用call(“net use g:)