【问题标题】:Python subprocess does not take correct argumentsPython 子进程不接受正确的参数
【发布时间】:2014-11-06 08:06:11
【问题描述】:

我使用的是 Windows 和 32 位 Python 2.7。

我已经阅读了许多涉及使 Python 中的子进程模块正常工作的帖子 - 使 shell = True、单个字符串与字符串列表、使用原始字符串等。我感到困惑的是 Python 不仅失败了生成我正在执行的程序的输出,但也无法运行文档中介绍的某些命令。

例如,当我尝试在 python 交互式控制台中使用https://docs.python.org/2/library/subprocess.html#subprocess.check_call 中介绍的“subprocess.check_call(["ls", "-l"])”时,它会产生“WindowsError: [Error 2] The system找不到指定的文件”。

同样,当我尝试使用文档中出现的“subprocess.call(["ls", "-l"])”时,Python 再次产生“WindowsError: [Error 2] The system cannot find指定的文件”错误。如果我使用“subprocess.call(["ls", "-l"], shell = True)",它只会正确执行并返回退出状态 1,这与我在文档页面上阅读的内容不同。

更重要的是,我希望通过 Python 执行一个 Windows 可执行程序。我已经在 Cygwin 终端中确认程序功能正常,使用 Python 执行时它不会打印任何输出(我注意到这个问题已被问过几次,但解决方案对我不起作用)。

import subprocess as sub

rt = sub.Popen([r'C:/Users/Y L/Documents/ssocr', '-d', '-1', 'Sample.JPG'], stdin = sub.PIPE, stdout = sub.PIPE, stderr = sub.PIPE)
out, err = rt.communicate()
print(out, err)

当我打印 (out, err) 时,这会生成一个空字符串对的元组。更有趣的是,当传入的图像文件完全是乱码时,程序以相同的方式执行并产生相同的输出,这意味着参数甚至没有正确传递。

import subprocess as sub

rt = sub.Popen([r'C:/Users/Y L/Documents/ssocr', '-d', '-1', 'asdfasdf.JPG'], stdin = sub.PIPE, stdout = sub.PIPE, stderr = sub.PIPE)
out, err = rt.communicate()
print(out, err)

关于参数由子流程模块处理,我有什么遗漏吗?

【问题讨论】:

  • 跳过 r 并翻转斜线?
  • @Will 这是我之前尝试过的事情之一,但没有运气。 Windows 似乎接受 '/' 或 '\' 很好,而 'r' 是正确识别路径中的间距。
  • Y L 是目录名吗?也就是说,可执行文件是C:/Users/Y L/Documents/ssocr,而不是C:/Users/Y,第一个参数是L/Documents/ssocr
  • @Dunes 是的,它是目录的名称。我认为使用原始字符串并将每个参数分隔在一个列表中而不是一个字符串可以解决这个问题。我弄错了吗?
  • 这将按预期工作。我想知道这是否可能是错误的根源。

标签: python windows subprocess


【解决方案1】:

ls 是类 Unix 系统的命令,在 Windows 下不存在。一个几乎等效的命令是cmd /c dir,因为dircmd 的一个内部命令。

在 Windows 下,最好先在cmd 窗口下直接执行命令,然后将单个命令行传递给Popen(如果命令是cmd,则先添加cmd /c内部命令)

【讨论】:

  • 所以我应该在cmd下运行命令'C:/Users/Y L/Documents/ssocr -d -1 Sample.JPG'?我怎样才能做到这一点?我是否应该将“cmd”作为 Popen 的第一个参数并在一个 Popen 调用下添加后续参数?
  • 实际上将'cmd'作为参数列表中的第一个元素传递只会使终端提示被管道作为输出,但仍然缺少程序输出。我是否正确解释了您的建议?
  • 我的建议是首先打开一个cmd 窗口,然后在该窗口中输入命令以查看会发生什么。我宁愿将命令语法的问题与 Python 执行的问题分开。
  • 我明白了。它给出错误“程序无法启动,因为您的计算机中缺少 cygwin1.dll。请尝试重新安装程序以解决此问题。”您认为这可能是为什么没有打印输出或错误的原因吗?
  • @user3583419 绝对是的。该消息由cmd.exe 打印,因为程序无法启动。这就是为什么我建议您首先手动启动程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2017-07-19
  • 2016-06-14
相关资源
最近更新 更多