gpt4 book ai didi

python - Os.PathLike 对象 - 处理通过curl发送的文件

转载 作者:太空宇宙 更新时间:2023-11-03 21:19:07 26 4
gpt4 key购买 nike

我想使用以下命令将文件 POST 到 Flask 应用程序:

curl -X POST http://url_of_lambda_function.com -F 'file=@/path/to/file.pdf'

Flask 应用程序具有通过子进程运行的 pdftotext 可执行文件。通常,这需要几个参数,如下所示......

result = subprocess.call([pdftotext, "-layout", file, "-"])

其中 pdftotext 是可执行文件的路径,“-layout”是一个选项,file 是 pdf 的路径('/path/to/file.pdf'),“-”是输出(在本例中) ,将其转储到屏幕)。

我的问题:

在我的 flask 应用程序中,我没有上述文件的文件路径。相反,我用以下方式处理传入文件:

data = request.files['file']
file = data.read()

数据是一个 werkzeug 文件对象,文件属于“字节”类。 Pdftotext 接受字符串、字节或 os.Pathlike 对象。

输入文件而不是“/path/to/file.pdf”会出现错误:

ValueError: embedded null byte

将文件转换为字符串并输入会出现另一个错误:

OSError: [Errno 7] Argument list too long: 'pdftotext'

我尝试将其包装为 BytesIO 对象、StringIO 对象和 IOTextWrapper,但遇到错误:

TypeError: expected str, bytes or os.PathLike object

所以我有点卡住了!这让我只能给它一个文件路径,而通过curl发送文件时我没有这个路径!

想法:

  • 我可以将文件下载到临时存储并传入路径。这可行,但会减慢函数速度,因此如果可能的话最好避免这种情况!
  • 我是否使用了其他类型的包装器来模仿 os.PathLike 对象或转换生成临时路径?

非常感谢任何帮助!

最佳答案

已解决

感谢 Dan D. 在问题评论中建议使用 NamedTemporaryFile()。

tmpfile = tempfile.NamedTemporaryFile()
tmpfile.write(file)
result = subprocess.call([pdftotext, "-layout", tmpfile.name, "-"])

还通过更改 subprocess.run 来将输出保存在变量中,如下所示:

result = subprocess.run(['pdftotext',tmpfile.name,'-'],stdout=PIPE,stderr=PIPE)
text = result.stdout

关于python - Os.PathLike 对象 - 处理通过curl发送的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54443144/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com