【发布时间】: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