标签: python-2to3

工具如2to3,合并除外

我为Python 3.1维护了一个项目的分支.当我最初从2.6创建端口时,我使用了2to3,但现在我不得不将2.6 fork中的新代码合并到3.1 fork中.如何自动对这些合并执行2to3操作?(如果重要,我会使用git.)

python merge python-2to3 python-3.x

4
推荐指数
1
解决办法
146
查看次数

使用元类将Python2转换为Python3会导致错误的流程

我有一个非常大的Python 2.7.6项目,我需要将其转换为Python 3.4.我使用了2to3脚本,但'metaclass'处理似乎被打破了.

我过滤了代码以缩短并查明问题.以下片段适用于Python 2.7.6:

class Base(object):
    class __metaclass__(type):
        def __new__(cls, classname, bases, dict):
            new = type.__new__(cls, classname, bases, dict)
            new.classname = classname
            print ("Base::__metaclass__::new. Called.")
            return new                 

class Heir(Base):
    class __metaclass__(Base.__metaclass__):
        def __new__(self, *args):
            new = Base.__metaclass__.__new__(self, *args)
            print ("Heir::__metaclass__::new. Called.")
            return new

    @classmethod
    def define(cls, nexttype):
        print ("Heir::define. Called.")

class HeirOfHeir(Heir):
    pass

Heir.define(HeirOfHeir)
Run Code Online (Sandbox Code Playgroud)

代码按预期打印:

Base::__metaclass__::new. Called.
Base::__metaclass__::new. Called.
Heir::__metaclass__::new. Called.
Base::__metaclass__::new. Called.
Heir::__metaclass__::new. Called.
Heir::define. Called.
Run Code Online (Sandbox Code Playgroud)

但是当使用Python 3.4运行代码时,我只有最后一个打印:

Heir::define. Called.
Run Code Online (Sandbox Code Playgroud)

要么2to3计算错误,要么需要进行一些手工操作.不幸的是,我对元类很少有经验.

python metaclass python-2to3

4
推荐指数
1
解决办法
411
查看次数

2to3转换后如何解决print((((双括号)?

将项目迁移到Python 3(2to3-3.7 -w -f print *)时,我观察到很多(但不是全部)print语句变成了print((...)),因此这些语句现在打印出元组而不是执行预期的行为。我收集到,如果我使用过的话,那么我-p现在会处于一个更好的位置,因为from __future__ import print_function它位于每个受影响的模块的顶部。

我正在考虑尝试使用sed修复此问题,但是在此之前,我想知道是否还有其他人对此进行过处理。是否有2to3功能可以清除此问题?

确实使用版本控制(git),并且前后都有提交(以及2to3创建的.bak文件),但是我不确定如何将自己所做的更改与打印情况区分开。

sed python-2to3 python-3.x

4
推荐指数
2
解决办法
850
查看次数

将selenium.py转换为2到3的python 3

我正在尝试转换用python 2编写的selenium.py.

如下所示,我将selenium.py复制到C:\ Python32\Tools\Scripts>并执行后

2to3.py selenium.py
Run Code Online (Sandbox Code Playgroud)

我看到文件是一样的.我做错了什么?或者从哪里下载这个文件转换?

C:\Python32\Tools\Scripts>2to3.py selenium.py
RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
RefactoringTool: Refactored selenium.py
--- selenium.py (original)
+++ selenium.py (refactored)
@@ -18,8 +18,8 @@

 # This file has been automatically generated via XSL

-import httplib
-import urllib
+import http.client
+import urllib.request, urllib.parse, urllib.error
 import re

 class selenium:
@@ -186,34 +186,34 @@
         self.extensionJs = extensionJs

     def start(self):
-        print (self.browserURL)
+        print((self.browserURL))
         result …
Run Code Online (Sandbox Code Playgroud)

python selenium python-2to3 python-3.x

3
推荐指数
1
解决办法
2350
查看次数

2to3-2.7和2to3-3.1有什么区别?

我的Ubuntu 12.04股票python安装有2个程序,用于将代码转换为Python 3.x:2to3-2.72to3-3.1.有什么不同?

python python-2to3 python-2.7 python-3.x ubuntu-12.04

3
推荐指数
1
解决办法
802
查看次数

python 2to3中的eval(input())

从Python 2to3 doc:

input:

转换input(prompt)eval(input(prompt))

我正在尝试使用Python 2几年后学习Python 3.任何人都可以解释为什么工具eval在调用之前插入input,以及我是否应该在所有Python 3代码中执行此操作?

python python-2to3

3
推荐指数
1
解决办法
675
查看次数

有没有办法用pip install运行2to3?

我正在尝试使用pip install -r requirements.txt.来维护依赖项.但是,某些必需的包不直接支持Python 3,但可以使用手动转换2to3.

在做什么时有办法强制自动pip运行2to3这些包pip install -r requirements.txt吗?

python pip python-2to3 requirements.txt

3
推荐指数
1
解决办法
4525
查看次数

如何启动自己的 2to3 fixer?

我写了自己的修复程序,我该如何运行它?我没有找到明显的方法来做到这一点。

只有这个:

> cd /usr/lib/python2.7/lib2to3/fixes/
> ln -s path/to/my_fixer.py
Run Code Online (Sandbox Code Playgroud)

然后运行它:

> cd path/to/project
> 2to3 -f my_fixer .
Run Code Online (Sandbox Code Playgroud)

python python-2to3

3
推荐指数
1
解决办法
858
查看次数

如何使用2to3就地编辑文件?

我可以2to3在终端中加载文件。它进行了大量打印,输出如下:

- print str
+ print(str)  ... 
Run Code Online (Sandbox Code Playgroud)

但是文件保留不变。而且我在“运行2to3” 之后没有任何说明。请帮忙。

python python-2to3

3
推荐指数
1
解决办法
1443
查看次数

如何使用2to3转换目录中的所有文件

我可以翻译一个文件。但是我不明白如何翻译整个目录。从文档:

To translate an entire project from one directory tree to another use:
$ 2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode
Run Code Online (Sandbox Code Playgroud)

能给我一个具体的例子吗?我有python2文件D:\Dir1,想在中获取新文件D:\Dir2。我现在在命令提示符下Dir1键入c:\Users\........\Python36\Tools\scripts\2to3.py -w

那么我应该使用什么命令?

python python-2to3

3
推荐指数
1
解决办法
4343
查看次数

如何使用相同的代码将unicode文本写入python 2和3中的文件?

我正在尝试编写一个可以运行python 2和3的程序.它从网站读取字符并写入文件.我已经unicode_literals从__future__ 导入了.

直接尝试写一个看起来像这样的字符串:

txt = u'his$\u2026\n'
Run Code Online (Sandbox Code Playgroud)

会导致UnicodeEncodeError:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2026' in position 4: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

将它写入python2中的文件的唯一方法是:

fp = open("/tmp/test", "w")
txt2 = txt.encode('utf-8')
fp.write(txt2) # It works
type(txt2) # str - that is why it works
Run Code Online (Sandbox Code Playgroud)

但是,尝试在python3中重用相同的代码是不行的,因为在python 3中,

type(txt2) # is byte type
Run Code Online (Sandbox Code Playgroud)

例如

txt.encode('utf-8')
b'his$\xe2\x80\xa6\n'
Run Code Online (Sandbox Code Playgroud)

强制a fp.write(txt2)会抛出TypeError:

TypeError: write() argument must be str, not bytes
Run Code Online (Sandbox Code Playgroud)

因此,可以txt = u'his$\u2026\n'在python 2和3中使用相同的代码块写入文件中.(除了在fp.write上使用包装器)

python python-2to3 python-unicode

3
推荐指数
1
解决办法
3787
查看次数

TypeError:整数参数expect got float'Python 3.4

我得到一个预期浮点数的整数错误,所以我改变它然后反过来说浮点数不能是一个整数.之前我遇到过类似的问题,只是把它改成了int.

我正在通过python27中的教程学习,但大多数情况下通过故障排除让它们在python34中工作.这个我被困住了.

TypeError:整数参数expect go float'

for tile in return_tiles:
    pygame.draw.circle(screen, [34, 95, 200],
    [tile.x + half - 2, tile.y + half - 2], 5 )
Run Code Online (Sandbox Code Playgroud)

所以我接着在下面进行了更改,它通常会像下一个那样工作,但在这种情况下会出错

TypeError:'float'对象不能解释为整数

   for tile in return_tiles:
        pygame.draw.circle(screen, (34, 95, 200), (int(tile.x + half -2),int(half - 2, tile.y + half - 2)), int(5))
Run Code Online (Sandbox Code Playgroud)

我如何修复下面的另一个例子是一个整数,但在上面的情况下它不起作用

 pygame.draw.circle(screen, (34, 95, 200), (int(tile.x + half -2),int(half - 2, tile.y + half - 2)), int(5))
Run Code Online (Sandbox Code Playgroud)

我一直通过在线学习教程来教自己,但大多数是python的早期版本2.7等.但这在很大程度上并不是一个问题.我一直在使用错误消息,大多数情况下我可以弄清楚,如果有时我没有运行2to3.py或搜索找到答案.

python pygame python-2to3 python-3.x

2
推荐指数
1
解决办法
5691
查看次数

让 2to3 使用空格而不是制表符

我用来2to3转换 python 模块的文件夹。一切都很顺利,但是当我去运行其中一些时,它给了我一个关于空格和制表符的错误。我的理论:当2to3更改一行时,它使用制表符而不是空格,这与其他未更改的行不同。我想知道是否有办法改变这一点。

错误是:

TabError: inconsistent use of tabs and spaces in indentation
Run Code Online (Sandbox Code Playgroud)

代码片段很难显示,因为显示的制表符相当于 4 个空格,但我检查了一下,发现这种情况正在发生。

python python-2to3

1
推荐指数
1
解决办法
1788
查看次数