请求包在两个“相同”的python环境中的不同行为

时间:2019-12-18 19:07:13

标签: python python-2.7 python-requests centos

我有两个在Centos 5.9中运行Python 2.7的虚拟机(VM)。由于Centos 5.9随Python 2.4一起提供,我们不得不手动构建和编译Python 2.7。这两个VM在不同的时期内以不同的步骤进行设置,因为第一个VM是3年前使用Python 2.7.11设置的,而第二个是一天前使用Python 2.7.17设置的。它们都具有相同版本的请求包(2.9.1)。

问题是,当我运行以下代码时:

from datetime import datetime
import sys
from asterisk.agi import *
import requests

url_format = 'http://app.domain.com/api/v1/object/search?id={}'
id = 561089
response = requests.get(url_format.format(id))
if response.status_code == 200:
    print(response.json())

在较新的VM(Python 2.7.17)中出现以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/requests/models.py", line 800, in json
    self.content.decode(encoding), **kwargs
  File "/usr/local/lib/python2.7/json/__init__.py", line 339, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python2.7/json/decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/lib/python2.7/json/decoder.py", line 382, in raw_decode
    raise ValueError("No JSON object could be decoded")

虽然我没有在先前的VM上看到错误,但在实际的json对象上却得到了错误:

{u'uri': u'user.name@app.domain.com', u'domain': u'app.domain.com', u'user': u'user.name'}

奇怪的是,查看response.text的值,在两种设置下我都得到相同的结果:

// first
u'{"uri": "user.name@app.domain.com", "domain": "app.domain.com", "user": "user.name"}'

// second
u'{"uri": "user.name@app.domain.com", "domain": "app.domain.com", "user": "user.name"}'

运行以下代码:     导入json     json.loads(r.content)

结果如下:

// first
{u'uri': u'user.name@app.domain.com', u'domain': u'app.domain.com', user': u'user.name'}

// second
{u'u\x00r': u's\x00e\x00b\x00a\x00s\x00t\x00i\x00', u'd\x00o\x00m\x00': u'2\x000\x009\x00.\x001\x003\x000\x00', u's\x00e\x00c\x00o\x00n\x00d\x00': u's\x00e\x00b\x00a\x00s\x00t\x00i\x00a\x00n\x00.\x00t\x00o\x00r\x00o\x00@\x00c\x00h\x00i'}
Note: In all cases but this last one, the actual characters were replaced.

如果两个都是Python 2.7,它们都具有相同版本的请求包,并且都从服务器接收了完全相同的文本,那么在第二个VM中出现错误怎么办?我必须以其他方式编译Python吗?

我如何在第二个VM中编译Python 2.7.17

我无法告诉您Python 2.7.11是如何在第一个VM中编译的,但是Python 2.7.17是通过以下方式编译的:

下载并安装OpenSSL

cd /tmp 
curl http://www.openssl.org/source/openssl-1.0.2h.tar.gz | tar zxvf - 
cd openssl-1.0.2.h 
./config shared --prefix=/usr/local/ 
make && make install

设置一些环境变量

export LDFLAGS="-L/usr/local/lib/"
export LD_LIBRARY_PATH="/usr/local/lib/"
export CPPFLAGS="-I/usr/local/include -I/usr/local/include/openssl"

下载并安装Python 2.7.17

wget http://python.org/ftp/python/2.7.17/Python-2.7.17.tar.xz
tar xf Python-2.7.17.tar.xz
cd Python-2.7.17
./configure --prefix=/usr/local/ --enable-unicode=ucs4 --enable-shared
make && make altinstall

最后,我必须将/usr/local/lib/添加到/etc/ld.so.conf文件中。

0 个答案:

没有答案