我正在尝试使用geventhttpclient通过https上传大文件。
我得到的追溯包括: 字符串长于2147483647字节
那是0x7fffffff BTW - 你可以存储在32位有符号整数中的最高数字。
狩猎“字符串长于。*字节”,我看到它在_ssl.c中。
虽然有点奇怪 - 我使用64位Linux Mint 17.3 - 我认为限制是2 ^ 63-1而不是2 ^ 31-1。
_ssl.c的相关部分似乎是:
if (buf.len > INT_MAX) {
PyErr_Format(PyExc_OverflowError,
"string longer than %d bytes", INT_MAX);
goto error;
}
我在C中写了一个小测试程序:
#include <stdio.h>
#include <limits.h>
#include <Python.h>
int main()
{
fprintf(stderr, "Size of int is %lu\n", sizeof(int));
fprintf(stderr, "Size of size_t is %lu\n", sizeof(size_t));
fprintf(stderr, "Size of ssize_t is %lu\n", sizeof(ssize_t));
fprintf(stderr, "Size of void * is %lu\n", sizeof(void *));
fprintf(stderr, "Size of long is %lu\n", sizeof(long));
fprintf(stderr, "INT_MAX is %u\n", INT_MAX);
fprintf(stderr, "size of Py_ssize_t is %lu\n", sizeof(Py_ssize_t));
return 0;
}
其中输出:
Size of int is 4
Size of size_t is 8
Size of ssize_t is 8
Size of void * is 8
Size of long is 8
INT_MAX is 2147483647
size of Py_ssize_t is 8
所以看起来我的INT_MAX很小(32位),即使我的Py_ssize_t很大(64位)。
然而:
$ /usr/local/cpython-2.7/bin/python
cmd output started 2016 Tue Aug 30 08:41:43 AM PDT
Python 2.7.11 (default, Jun 14 2016, 10:45:41)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.maxint
9223372036854775807
我需要做什么才能让INT_MAX达到2 ^ 63-1?
我知道我可以使用生成器(http://docs.python-requests.org/en/latest/user/advanced/#chunk-encoded-requests)以块的形式上传文件,但如果可行,我宁愿一次性上传。
我自己使用--enable-shared和$ LDFLAGS编译了这个Python。
谢谢!