【发布时间】:2017-06-21 13:06:35
【问题描述】:
我想使用 Python 的 subprocess 模块将正则表达式传递给 pdfgrep。代码执行没有错误,但 pdfgrep 没有正确接收参数。测试 pdf 在 cwd 中,包含字符串“Mary Jane”。这是我的代码(Python 3.6):
import subprocess
filtered = ['[A-Z].+Jane'] # the list of regexes is shortened to one string, to keep the example simple.
for regex in filtered:
arg = 'pdfgrep -PrH ' + f"{regex}"
process_match = subprocess.run(arg, stdout=subprocess.PIPE, shell=True)
预期结果是process_match 将包含一个包含匹配项的CompletedProcess() 对象。
但相反,它返回以下内容:
CompletedProcess(args="pdfgrep -PrH '[A-Z].+Jane'", returncode=127, stdout=b'')
在命令行中,调用相同的pdfgrep 命令会找到匹配的pdf。我可以使用如下代码在 Ruby 中相当简单地完成这项任务:
process_match = %x[pdfgrep -PrH "#{regex}"]
我是 python 新手。尝试将正则表达式传递给外部命令时出现什么问题?
【问题讨论】:
-
我不确定这是否是我遗漏的语法,但您是否在第一个代码示例中,
-PrH之后和/或{regex}之前省略了空格?另外,除了pdfgrep之外的其他程序是否也会发生这种情况? (例如,假设您在一个存在该程序的类 UNIX 系统上,您可以使用/bin/echo执行此操作吗?) -
@DavidZ 关于缺少空格的说法是对的:应该是
'pdfgrep -PrH '但这仍然不会导致预期的结果。使用'/bin/echo '确实会产生预期的行为,也许这与 pdfgrep 本身有关? -
您的评论告诉我,我应该指定 pdfgrep 的完整路径。请参阅我对自己问题的回答。
标签: python regex python-3.x subprocess