运行一个使用python 3和python 2.7模块的Python程序?

时间:2017-11-18 08:25:36

标签: python python-3.x python-2.7

我正在寻找一种在同一程序中结合python 3.x和python 2.x模块的方法。

目前,我们想使用YAPSI加载它们,但我猜这是一个失败的原因。

**显然,它依赖于lib的模块当前没有转换为python 3并且需要很长时间才能完成。

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方法。但是你可以;用狡猾的方式! (有三种棘手的方法):

首先:

  
      
  1. 下载python 2x和3x便携式口译员

  2.   
  3. 将它们复制并粘贴到同一文件夹

  4.   
  5. 分别编写程序的每个部分和原始程序   口译员(将你的程序写成功能或对象)

  6.   
  7. 使用python3x制作一个主程序并用这两个部分调用   subprocess,exec或其他方法

  8.   
  9. 现在您可以将此文件夹编译为exe文件或进行设置(   包exe文件)并完成了!

  10.   

第二名:

  

如果你对cython友好,你可以转换你的每个部分   程序到C / C ++,然后你可以合并或重新转换为python   码!

第三:

  

如果你对jython友好,你可以转换你的每个部分   程序到java(jar文件),然后你可以合并或重新转换为python   码!

祝你好运......

答案 2 :(得分:0)

Python 2和3在一个过程中不合作。您可以使用remote procedure calls,也许使用Pyro (Python remote objects)。这与多处理中的管道具有类似的性能问题。 SharedArray可以使用共享内存更快地运行,但仅限于数字数组。