1

第一次在这里提问:

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

在 cmd 窗口中:

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

issuccessful-->命令成功完成

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

1 回答 1

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:或带有协议的 URL "http,或类似的东西。不管它是什么,它都不是可用的网络位置,这很可能会导致错误 67。

正如 Ben 指出的那样,您的system调用存在类似的问题——您在整个字符串周围添加了一对额外的引号。如果你真的想弄清楚,这可能是有原因的……但我认为你不想弄清楚。就当做“我做错事,但我很幸运”,以后不要那样做。

最后,正如文档所说:

在 Windows 上,将 args 序列转换为可以解析的字符串

这意味着,如果您已经有一个适用于 Windows 的命令行,则最好将其用作字符串,而不是尝试将其分解为一个序列以subprocess进行重新组合。

(请记住,这仅适用于 Windows!在其他平台上,不是构建命令行字符串以传递给CreateProcess系列中的函数,而是构建字符串subprocess数组以传递给exec系列中的函数。)

所以,只需这样做:

call("net use g: http://na.com/DMP/DMP/programming/")
于 2013-02-01T22:12:38.810 回答