我正在寻找一种在同一程序中结合python 3.x和python 2.x模块的方法。
目前,我们想使用YAPSI加载它们,但我猜这是一个失败的原因。
**显然,它依赖于lib的模块当前没有转换为python 3并且需要很长时间才能完成。
答案 0 :(得分:0)
你可以,但这是很多工作。问题主要是print-statements中的语法错误。 简单的打印适用于任何版本。
print(" Supports all versions of Python!")
但是,如果您使用不可避免的任何更高级的打印功能,您最终会出现语法错误或者不打印您想要的内容。 Python 2的尾随逗号在Python 3中变成了一个参数,所以如果你使用尾随逗号来避免打印后的换行符,这将在Python 3中看起来像
print('Text to print', end=' ')
这是Python 2下的语法错误。
在Python 2.6下有一个
__future__ import
将打印成功能。因此,为了避免任何语法错误和其他差异,您应该启动使用print()with from的任何文件 future import print_function。 future 导入仅适用于Python 2.6及更高版本,因此对于Python 2.5及更早版本,您有两种选择。您可以将更复杂的打印转换为更简单的打印,也可以使用在Python 2和Python 3下都可以使用的单独打印功能。 要解决打印问题,您可以编写自己的打印功能,这更加贴心。
2)导入错误。 之所以发生这种情况,是因为重组标准库很容易就像
一样try:
import configparser
except ImportError:
import ConfigParser as configparser
这只适用于重命名的导入,对于新模块或者是几个旧模块的合并或子模块,你必须将它们转换为2到3,这很容易。
3)整数不兼容。
在Python 3中,第一个是int和long类型已经合并,这意味着你不能再通过添加L后缀来指定一个整数应该很长。 1L是Python 3中的语法错误。 你可以像
那样避免它import sys
if sys.version_info > (3,):
long = int
long(1)
1L
另一个变化是八进制文字的语法也发生了变化。至 。避免使用十进制或十六进制值,并将八进制值放在
之类的注释中f = 420 # 644 in octal, 'rw-r--r--'
4)处理二进制数据。 所有这些中最棘手,最复杂的。您可以阅读文档here。
答案 1 :(得分:0)
来自@Frrank回答;我强烈建议您自己将模块源代码转换为python 3x!或者通过在谷歌搜索找到的许多工具...
但通常我认为这个问题没有pythonic方法。但是你可以;用狡猾的方式! (有三种棘手的方法):
首先:
下载python 2x和3x便携式口译员
将它们复制并粘贴到同一文件夹
分别编写程序的每个部分和原始程序 口译员(将你的程序写成功能或对象)
使用python3x制作一个主程序并用这两个部分调用 subprocess,exec或其他方法
- 醇>
现在您可以将此文件夹编译为exe文件或进行设置( 包exe文件)并完成了!
第二名:
如果你对cython友好,你可以转换你的每个部分 程序到C / C ++,然后你可以合并或重新转换为python 码!
第三:
如果你对jython友好,你可以转换你的每个部分 程序到java(jar文件),然后你可以合并或重新转换为python 码!
祝你好运......
答案 2 :(得分:0)
Python 2和3在一个过程中不合作。您可以使用remote procedure calls,也许使用Pyro (Python remote objects)。这与多处理中的管道具有类似的性能问题。 SharedArray可以使用共享内存更快地运行,但仅限于数字数组。