首页 > 解决方案 > Python 2.7 mmap http 运行后问题:TypeError:read() 恰好采用 1 个参数(给定 0)

问题描述

使用带有 mmap 的 python 2.7 执行 http 上传,遇到运行时异常:

fdata = fp.read()
    TypeError: read() takes exactly 1 argument (0 given)

这是代码:

    import requests
    dcs_session = requests.Session()
    with open(filename, 'rb') as f:
        with contextlib.closing(mmap.mmap(f.fileno(), 0, 
access=mmap.ACCESS_READ)) as mmap_obj:
            resp = dcs_session.post(url, headers=additional_headers, 
data=form_data,files={'file': mmap_obj}, timeout=1000, verify=verify_arg)

这是例外:

    fdata = fp.read()
    TypeError: read() takes exactly 1 argument (0 given)
    
    ERROR (/usr/bin/dca.py:563 : dcs_push  Stack trace - Traceback (most recent call last):
      File "/usr/bin/dca.py", line 540, in dcs_push
        verify=verify_arg)
      File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 555, in post
        return self.request('POST', url, data=data, json=json, **kwargs)
      File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 494, in request
        prep = self.prepare_request(req)
      File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 437, in prepare_request
        hooks=merge_hooks(request.hooks, self.hooks),
      File "/usr/lib/python2.7/site-packages/requests/models.py", line 308, in prepare
        self.prepare_body(data, files, json)
      File "/usr/lib/python2.7/site-packages/requests/models.py", line 496, in prepare_body
        (body, content_type) = self._encode_files(files, data)
      File "/usr/lib/python2.7/site-packages/requests/models.py", line 159, in _encode_files
        fdata = fp.read()
    TypeError: read() takes exactly 1 argument (0 given)

标签: python-2.7postmmap

解决方案


mmapread方法要求您在 Python 3.3 之前传递一个参数。它不是文件对象的直接替换,即使它是,使用它也没有任何好处,因为该read方法无论如何都会制作副本,因此您不会避免任何分配的内存使用。只需传递文件对象而不是mmaping 它,或者升级到现代 Python(Python 2 已经失去支持一年多了;停止在其中编写新代码)。


推荐阅读