我手头有一个简单的任务...处理异常,因此在python2.x / 3.x之间使用urllib / urllib2时,代码不会抛出IncompleteRead
for python2
try:
page = urllib2.urlopen(urls).read()
except httplib.IncompleteRead, e:
page = e.partial
for python3
try:
page = request.urlopen(urls).read()
except (http.client.IncompleteRead) as e:
page = e.partial
现在因为模块本身不同,如何尝试 - 除非我不知道我的用户将运行哪个python版本?
我不能在我的尝试中检查python版本 - 除了......或者我可以吗?
有没有办法捕获它的超级类,所以它对于两个python版本都变得相同?如果有,怎么样?
答案 0 :(得分:2)
你可以:
try:
from httplib import IncompleteRead
import urllib2 as httpclient
except ImportError:
from http.client import IncompleteRead
import request as httpclient
然后使用:
try:
page = httpclient.urlopen(urls).read()
except IncompleteRead as e:
page = e.partial
在python2和python3中。
答案 1 :(得分:1)
除非你需要Python 2.5,否则你可以在2.x。
中使用new-style except:statements因此,唯一的区别是模块名称。您可以手动try
Sraw's answer。但您可能应该使用six
,futurize
或modernize
作为the official porting docs和大多数其他双版本和移植指南推荐,这正是这种事情他们有利于他们。
使用six.moves
:
from six.moves import http_client
from six.moves import urllib_request
try:
page = urllib_request.urlopen(urls).read()
except http_client.IncompleteRead as e:
page = e.partial
或者future
:
from future import standard_library
standard_library.install_aliases()
import http.client
import urllib.request, urllib.error, urllib.parse
try:
page = urllib.request.urlopen(urls).read()
except http.client.IncompleteRead as e:
page = e.partial
或者,更好的是,只需编写2.7代码:
import httplib
import urllib2
try:
page = urllib2.urlopen(urls).read()
except httplib.IncompleteRead as e:
page = e.partial
...然后在其上运行futurize
,它会自动为您提供上面的future
代码。
答案 2 :(得分:0)
您可以尝试...除了在 init 模块中导入,然后将您的代码拆分为python2和python3模块:
try:
import urllib2
pyver2()
except ModuleNotFoundError:
import requests
pyver3()
哦请求没有做你想要的,也许你的意思是'请求'和请求没有'urlopen'方法你需要使用'get()'。