Python - 如何在遗留解释器上运行为新版本编写的代码?

时间:2014-05-23 12:28:27

标签: python linux cygwin version

修改 最后我做到了,但完整的过程是痛苦的屁股和未来的发展我将明确听取@Martijn Pieters的建议

我是python新手,需要将我在Windows(cygwin)机器上执行的一些Python项目转移到Linux。该项目使用ipaddress模块​​。我没有root用户访问权限,也无法从Linux机器访问互联网,因此无法安装任何东西。所以我将我的项目文件(ipfind_v5.py)和ipaddress.py模块复制到一个Linux文件夹,我在cygwin的/lib/python2.7/site-packages目录下找到了该模块。问题是当我发出脚本时出现以下错误:

[wakatana@zeus]$ python ipfind_v5.py
Traceback (most recent call last):
  File "ipfind_v5.py", line 28, in ?
    import ipaddress as IP
  File "/home/wakatana/ipfind.py/ipaddress.py", line 28
    if b'\0'[0] == 0:  # Python 3 semantics
           ^
SyntaxError: invalid syntax

我已经取代了

if b'\0'[0] == 0:

if '\x00' == 0:

但是又出现了另一个错误:

[wakatana@zeus ipfind.py]$ python ipfind_v5.py
Traceback (most recent call last):
  File "ipfind_v5.py", line 28, in ?
    import ipaddress as IP
  File "/home/wakatana/ipfind.py/ipaddress.py", line 1123
    except ValueError as exc:
                       ^
SyntaxError: invalid syntax

然后根据这篇关于例外的https://docs.python.org/2/tutorial/errors.html文章,我做了:

sed -i 's/ as exc/, exc/' ipaddress.py

在此之后我收到另一个错误(ipaddress模块​​的来源在这里:https://github.com/phihag/ipaddress/blob/master/ipaddress.py):

[wakatana@zeus ipfind.py]$ python ipfind_v5.py
Traceback (most recent call last):
  File "ipfind_v5.py", line 28, in ?
    import ipaddress as IP
  File "/home/wakatana/ipfind.py/ipaddress.py", line 1173
    if isinstance(b, bytes)
     ^
SyntaxError: invalid syntax

然后我重写了这一部分:

return u'.'.join(_compat_str(struct.unpack('!B', b)[0]
                             if isinstance(b, bytes)
                             else b)
                 for b in _compat_to_bytes(ip_int, 4, 'big'))

进入这个(希望这是uquivalents,看起来代码运行正常):

retval=[]
for b in _compat_to_bytes(ip_int, 4, 'big'):
  if isinstance(b, str):
    retval.append(_compat_str(struct.unpack('!B', b)[0]))
  else:
    retval.append(b);

return unicode(".".join(retval))

需要另外两个步骤: changing bytes to str changing: from . import foo to: import foo

配置:

Linux版本: Python 2.4.3

Windows(cygwin)版本: Python 2.7.3

1 个答案:

答案 0 :(得分:2)

你无法使Python 2.4运行Python 2.7代码,没有。

Python项目遵循semantic version model使用MAJOR.MINOR.PATCH编号方案。 Python保证语法在补丁版本中保持不变; 2.4代码在2.4.x版本中正常工作,禁止错误。在次要版本中,Python尝试维护向后兼容性;早期2.x版本的代码可以继续在以后的版本中使用。因此,在使用Python 2.7运行时,为2.4编写的代码仍然有效。 Python 3是一个新的主要发布周期,并引入了主要的向后不兼容的更改。

except Exception, name:except Exception as name:的更改是Python 2.6中引入的一项此类更改;旧语法容易出错,较新的语法使得将捕获的异常绑定到名称更加清晰。

也就是说,已经做了很多努力来编写可以在Python 2.x和Python 3.x解释器上运行的代码。这包括在Python 2.x版本中添加以接受某些类型的语法,否则这些语法只能在Python 3中使用。

b'...'语法就是这样一种变化。 Python 2 str类型已被Python 3中的bytes类型替换,b'..'表示法是bytes字符串文字语法。由于bytes实际上是Python 2中的旧str类型,因此您也可以使用b'...' from Python 2.6 onwards,从而生成常规的Python 2字符串对象。相反,较新的Python 3.x版本接受u'...'作为字符串文字语法,在Python 2中会产生Unicode字符串值。

每个主要和次要版本都记录了What's new section中发生了哪些更改以及新增内容,如果要将代码反向移植到Python 2.4,则必须阅读这些文档。

没有通用转换器'为了这。有一个工具可以在Python 2和Python 3语法之间进行转换(请参阅2to33to2工具),但这些工具不会帮助您将兼容2.7的代码打包到2.4。

然而,编译Python解释器并将其安装在您的主目录中相对容易,没有root访问权限。我下载了Python 2.7,使用./configure --prefix=$HOME配置,然后makemake install将其配置为~/bin/~/lib/python2.7/,并运行带有二进制文件的脚本。