Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
subprocess.call与os.system python_Python_Python 2.7_Subprocess_Os.system - Fatal编程技术网

subprocess.call与os.system python

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", "

第一次提问:

我需要在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", ":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/“
而不是URL
http://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:)