我有两个在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
文件中。