gpt4 book ai didi

python - 如何使用 Python 请求模块上传一堆文件

转载 作者:行者123 更新时间:2023-12-04 04:02:27 25 4
gpt4 key购买 nike

当我使用 requests 模块通过一个请求上传至少 400 个文件时,我在 macOS 系统上遇到了 Too many open files 错误。

我试过 ulimit -n 20000

还检查了:

  • sysctl kern.maxfiles 得到 98304
  • sysctl kern.maxfilesperproc 得到 49152

然而,它并没有奏效。

这是我的代码:

import os
import requests


url = 'http://127.0.0.1:8000/api/upload'
file_path = '/Users/BonJu/Projects/downloads'
file_list = os.listdir(file_path)
files = []
for file in file_list:
try:
source = open(os.path.join(file_path, file), 'rb')
files.append(('file', source))

except Exception as e:
print('File: %s, Error: %s' % (file, e.__str__()))
continue

response = requests.post(url=url, data={'uploader': 'admin'}, files=files)

最终结果:

File: test_252.docx, Error: [Errno 24] Too many open files: '/Users/BonJu/Projects/downloads/test_252.docx'
File: test_253.docx, Error: [Errno 24] Too many open files: '/Users/BonJu/Projects/downloads/test_253.docx'
File: test_254.docx, Error: [Errno 24] Too many open files: '/Users/BonJu/Projects/downloads/test_254.docx'
...
File: test_418.docx, Error: [Errno 24] Too many open files: '/Users/BonJu/Projects/downloads/test_418.docx'

因为它是一个将发送的日志文件链接到问题的 API 服务器,所以我需要在一个请求中发送所有文件,否则经理将收到多封邮件并且无法解决问题。

这种情况有什么解决办法吗?

解决方案

我最终调整了我的 API 来保存一个临时文件来存储上传日志,并传递一个 status 参数来控制最终输出。

我的代码:

payload = {
'status': 'finish',
'uploader': 'admin'
}
response = requests.post(url=url, data=payload, files=files)

应用程序接口(interface):

@api_view(['post'])
def upload(request, debug, api_version):
status = request.POST.get('status')
file_list = request.FILES.getlist('file')

if status == 'finish':
# open the temp file and insert the last logs then output

else:
# create/insert the logs and save to a temp file

return Response({'status': status, 'files': file_list})

最佳答案

我建议从所有这些文件中创建一个 tar 文件。

或在读取文件内容后关闭文件(而不是在您发布请求之前让文件描述符保持打开状态

关于python - 如何使用 Python 请求模块上传一堆文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62870862/

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