修改 最后我做到了,但完整的过程是痛苦的屁股和未来的发展我将明确听取@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
答案 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语法之间进行转换(请参阅2to3
和3to2
工具),但这些工具不会帮助您将兼容2.7的代码打包到2.4。
然而,编译Python解释器并将其安装在您的主目录中相对容易,没有root访问权限。我下载了Python 2.7,使用./configure --prefix=$HOME
配置,然后make
,make install
将其配置为~/bin/
和~/lib/python2.7/
,并运行带有二进制文件的脚本。