python - subprocess.call 与 os.system python

标签 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。找不到网络名称” 我为最后一个列表项尝试了很多选项,但没有成功。

知道我可以在其中填充什么以成功完成此操作,或者使用不同的方法来映射驱动器。

最佳答案

您的代码中至少存在两个问题:

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

正如 Ben 指出的,您的系统调用也有类似的问题——您在整个字符串周围放置了一对额外的引号。如果你真的想弄清楚,这可能有一些原因……但我认为你不想弄清楚。就当“我做错了,但我幸运”吧,以后不要再这样做了。

最后,如the documentation说:

On Windows, an args sequence is converted to a string that can be parsed

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

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

所以,只需这样做:

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

关于python - subprocess.call 与 os.system python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14655629/

相关文章:

python - 在 Python 中解决进程链

python - 如何将存储在变量中的 Python 字符串转换为字节序列?

python - Dask Distributed 在compute()期间似乎没有传递请求的操作

python - 求最小差平方和的算法

Python Mechanize 表单提交

未找到 Python 方法,但已在类中定义

python - 为什么在子进程中运行 mpirun 时 Python 会挂起?

python - 比较两个 csv 文件并添加两个文件中不常见的列

django - django html_message 和发送邮件中的消息有什么区别

python - 如何创建/调用/关闭独立的python进程