为啥在将命令行图像文件中的参数作为参数传递时出现错误

Posted

技术标签:

【中文标题】为啥在将命令行图像文件中的参数作为参数传递时出现错误【英文标题】:Why am getting errors while passing argumets from commad line image file as an argument为什么在将命令行图像文件中的参数作为参数传递时出现错误 【发布时间】:2021-09-30 06:23:17 【问题描述】:
 import argparse

 from PIL import Image

 from pytesseract import *


def image_to_text(image):

   pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

   result = pytesseract.image_to_string(image, lang='eng')

   return result

if __name__ == "__main__":

  ap = argparse.ArgumentParser()

  ap.add_argument("-i", "--input", type = open, required = True, help='path to input image')

  args = vars(ap.parse_args())

  img = Image.open(ap)

  print(image_to_text(img))

使用命令行参数执行此代码后,将参数作为图像作为输入传递,出现以下错误。请帮助我为什么会发生这些错误。

Traceback(最近一次调用最后一次):

文件“C:\Users\Chaitanya\AppData\Local\Programs\Python\Python37\lib\site-packages\PIL\Image.py”,第 2972​​ 行,打开

fp.seek(0)

AttributeError: 'ArgumentParser' 对象没有属性 'seek'

在处理上述异常的过程中,又发生了一个异常: Traceback(最近一次调用最后一次):

文件“C:\Users\Chaitanya\Desktop\image\code.py”,第 18 行,

img = Image.open(ap)

文件“C:\Users\Chaitanya\AppData\Local\Programs\Python\Python37\lib\site-packages\PIL\Image.py”,第 2974 行,打开

fp = io.BytesIO(fp.read())

AttributeError: 'ArgumentParser' 对象没有属性 'read'

【问题讨论】:

添加print(args) 行,这样您就可以准确地看到解析器做了什么。 【参考方案1】:

ap 是参数解析器。它不是文件名,因此您不能将其作为文件名传递。您应该删除type=open,因为您真的不希望 arg 解析器打开它,然后将 Image 行更改为

 args = ap.parse_args()
 img = Image.open(args.input)

您想要解析的结果,而不是解析器本身。也就是说,args.input 将包含在--input 参数中指定的文件名。

【讨论】:

谢谢,更改答案后我收到以下错误 C:\Users\Chaitanya\Desktop\image>code.py --input imagetotext.png Traceback(最近一次通话最后一次):文件“ C:\Users\Chaitanya\Desktop\image\code.py",第 18 行,在 img = Image.open(args.input) AttributeError: 'dict' object has no attribute 'input' 我应该注意到您使用的是vars()。这在这里完全没有必要。只是把它作为一个对象。反正这样更方便。我调整了答案。

以上是关于为啥在将命令行图像文件中的参数作为参数传递时出现错误的主要内容,如果未能解决你的问题,请参考以下文章

将命令行参数输入文件传递给要解析的类

读取 LOLCODE 中的命令行参数

当我们不传递任何命令行参数时,为啥我们不会得到错误?

如何从文件传递命令行参数

在 Windows 命令行中使用批处理文件中的参数

将变量名称作为参数从外部函数传递到 R 中的内部函数时出现问题?