必须用 python2,但是希望自己的代码能够与 python3 兼容,如何写代码

2016-06-29 21:01:26 +08:00
 patrickstar
接触 python 不久,在写一些简单的测试、验证程序,主要用到 pyqt 、 matplotlib 。现在需要给一个大项目写一个小程序必须用到一个库,但是这个库是 python2 的,作者正在准备升级到 python3 ,但是我估计完成至少 1 年以后去了。

我希望我的代码能够 python2 、 python3 都兼容,有什么好的建议,我基本不会用到 print ,但是异常捕获肯定需要的!
6579 次点击
所在节点    Python
22 条回复
fcicq
2016-06-29 21:11:49 +08:00
带你在 py3 下的报错信息再来
WinterWu
2016-06-29 21:27:42 +08:00
print 现在用 py3 写法也是兼容的。弄好编码格式,其它都是小问题,好改。再做好兼容性检查。看看开源同时支持怎么做的很容易搞清楚的。
shelltank
2016-06-29 21:38:02 +08:00
可以看看 six(2*3) : https://pypi.python.org/pypi/six
billlee
2016-06-29 21:53:19 +08:00
python 3 的异常语法在 python 2.7 里能用啊, except Exception as e:
新写的代码比较容易兼容,就是不要用 python 2 里被废弃的特性,然后用 __future__ 启用 backported 的新特性:文件头加上
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function, unicode_literals # unicode_literals 和 division 如果没用到也可以不加
if 'xrange' in dir(__builtins__):
   range = xrange

比较不好搞的是一些变化大的标准库,比如 ConfigParser (所以我现在都用 json 或 yaml 格式的配置)。
http://python-future.org 这个库也不错,不过比较简单的代码也没必要额外引入一个这个大的库
ksc010
2016-06-29 21:57:07 +08:00
1.看下 2 和 3 语法上的不同
2.尽量使用一些同时兼容 2 和 3 的第三方库(比如 http 相关的直接使用 requests )
3. 通过 from __future__ import xxxx 使用一些 3 里面才有的功能 具体参考: https://docs.python.org/2/library/__future__.html
eriale
2016-06-29 22:04:45 +08:00
pycharm 里可以代码兼容检查, Code Compatibility Inspection :
https://www.jetbrains.com/pycharm/whatsnew/
binux
2016-06-29 22:15:01 +08:00
我的一篇老文章: http://blog.binux.me/2014/12/porting-to-python-3/
不过,如果你所依赖的库不支持 python3 ,那还是算了吧。。。没意义
JerningChan
2016-06-30 00:27:10 +08:00
那樣的話,你保證好自己代碼的風格,然後以後要用到 py3 時,用 script,自動改就可以呀
strahe
2016-06-30 00:30:49 +08:00
用 3 的习惯来写 2,不要用 2 来兼容 3,我现在就是这样的,问题不大(python2.7 本身就是过度的).
tinyproxy
2016-06-30 00:38:26 +08:00
依赖的作者要升级到 py3 你不一定要用 py3 啊,如果有 bug 或者你需要新 feature , back port 回来不就好了。
而且一般不会就这么一个依赖吧,你自己写的代码要 2/3 通用好说,但你的依赖不一定是 2/3 通用的。
shyling
2016-06-30 00:42:15 +08:00
1 ,各种 future,例如 unicode_literals,print_function
2 ,深坑之 str/bytes/unicode ,书写时建议按 3 的规矩来
3 ,各种库( blackhole)的支持情况以及变化

总结:都运行运行改错咯
Arnie97
2016-06-30 02:36:35 +08:00
可以试试这个库 https://pypi.python.org/pypi/pies
Neveroldmilk
2016-06-30 08:21:36 +08:00
一般做不到跨版本兼容,但是 py 内置的函数按照 py3 的格式写应该也是能在 py2 上运行的。
ToughGuy
2016-06-30 08:49:30 +08:00
pycharm 带有 python3 兼容性检查, 不兼容的地方会提示
pynix
2016-06-30 09:42:03 +08:00
直接用 3 写,跑在 2 下面出问题在做兼容方案。。。
lovepython
2016-06-30 11:22:36 +08:00
写完以后有一个 2to3 程序,转换下
glasslion
2016-06-30 14:41:03 +08:00
首先不要把同时兼容 Python2 和 Python3 想得多难,现在大多数的第三库都能做到同时兼容的。

如果你的项目不开源,只是内部使用的话,只支持一个 Python 版本也未尝不可。先用 Python2 开发, 要迁到 Python3 时, 用 2to3 转换一下就行了, 这样比同时支持 Python2/3 工作量小一些。

你得知道 Python2 和 Python3 的语法有什么不同, 有什么办法去解决这些这些不同。 [Supporting Python 3: An in-depth guide]( http://python3porting.com/) 这本书总结的很全面,而且开源,可以看看

选择第三方库时, 注意看它是否支持 Python3 。 Python3 标准库一般也有相应的 backport 的。

用 Jenkins , Travis CI , tox 之类的工具跑 Python2 + Python3 的 unit test
glasslion
2016-06-30 14:42:14 +08:00
@billlee configparser 有 Python2 的 backport https://pypi.python.org/pypi/configparser
julyclyde
2016-06-30 16:39:48 +08:00
@shelltank 我在 kombu 里还看到个 kombu.five 哈哈
lowzoom
2016-06-30 21:05:51 +08:00
用 from __future__ 可以解决大部分基本语法差异,但是不建议导入 unicode_literals ,因为在用 r 前缀字符串表示路径的时候, unicode_literals 会把\u 和后面连带的字符解析成 unicode 码字面值,满烦人的
而且手动加 u ,可以让你在写代码的时候,脑里会有 str 跟 unicode 的概念,这在 windows 下正确处理外部传进来的参数时还是很重要的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/289202

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX