Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3上的301重定向后Pycurl无法上载_Python_Python 3.x_Pycurl - Fatal编程技术网

Python3上的301重定向后Pycurl无法上载

Python3上的301重定向后Pycurl无法上载,python,python-3.x,pycurl,Python,Python 3.x,Pycurl,我正在对一个现有的基于python的Nagios插件进行故障排除,该插件使用PycURL测试可以在远程WebDav服务上执行不同的操作(GET、PUT、DELETE)。当服务响应301重定向时出现问题,错误为“411所需长度” 在检查原始服务和重定向服务的PUT请求的头之后,后者缺少“Content Length”头,这就是失败的原因。我还没有找到是否有一个选项,需要设置,这可能是需要的发生 我可以在Python2中通过使用“infiresize”选项添加文件大小来解决这个问题: c.setop

我正在对一个现有的基于python的Nagios插件进行故障排除,该插件使用PycURL测试可以在远程WebDav服务上执行不同的操作(GET、PUT、DELETE)。当服务响应301重定向时出现问题,错误为“411所需长度”

在检查原始服务和重定向服务的PUT请求的头之后,后者缺少“Content Length”头,这就是失败的原因。我还没有找到是否有一个选项,需要设置,这可能是需要的发生

我可以在Python2中通过使用“infiresize”选项添加文件大小来解决这个问题:

c.setopt(c.infiresize,os.path.getsize(filepath))
代码如下所示:

#/垃圾箱/蟒蛇2
导入pycurl
导入操作系统
filepath='/tmp/testfile'
c=pycurl.Curl()
c、 setopt(c.URL,'http://remote_host.com/filename')
c、 setopt(c.UPLOAD,1)
文件=打开(文件路径)
c、 setopt(c.READDATA,文件)
c、 setopt(c.FOLLOWLOCATION,1)
c、 setopt(c.infiresize,os.path.getsize(filepath))
c、 执行
c、 关闭()
file.close()文件
但是在Python3上(我在3.4、3.6和3.7上试过),同样的代码存在错误:

Traceback (most recent call last):
  File "/usr/lib64/python3.7/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 2: invalid continuation byte
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
pycurl.error: (42, 'operation aborted by callback')
回溯(最近一次呼叫最后一次):
文件“/usr/lib64/python3.7/codecs.py”,第322行,解码中
(结果,消耗)=自身缓冲区解码(数据,自身错误,最终)
UnicodeDecodeError:“utf-8”编解码器无法解码位置2中的字节0xda:无效的连续字节
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
pycurl.error:(42,“操作被回调中止”)
我不明白这是否是服务器回复的问题。但是如果我删除了infiesize选项,那么它就会失败,出现上面提到的411错误


如果有人知道我做错了什么,我们将不胜感激。

PycURL在Python 2和Python 3中对文件有不同的处理方式。听起来你好像遇到了这种不同。有关行为说明,请参见本手册页:

听起来像是在Python2上,libcurl能够对打开的文件描述执行stat(2)调用,以确定其大小。在Python3上,传递的不是文件描述符,而是函数,因此stat(2)方法不起作用,也不会为您计算文件长度


要解决Unicode解码错误,请在Python2上将代码更改为使用
READFUNCTION
而不是
READDATA
,然后查看出现的错误。如果服务器在响应中返回的错误消息不是有效的utf-8,则Python 3可能会按照您描述的方式失败。

PycURL在Python 2和Python 3中对文件的处理方式不同。听起来你好像遇到了这种不同。有关行为说明,请参见本手册页:

听起来像是在Python2上,libcurl能够对打开的文件描述执行stat(2)调用,以确定其大小。在Python3上,传递的不是文件描述符,而是函数,因此stat(2)方法不起作用,也不会为您计算文件长度

要解决Unicode解码错误,请在Python2上将代码更改为使用
READFUNCTION
而不是
READDATA
,然后查看出现的错误。如果服务器在响应中返回的错误消息不是有效的utf-8,则Python 3可能会按照您描述的方式失败