开源改变世界

Python3 端口 #228

推推 grbl 3年前 (2023-01-31) 177次浏览
关闭
ericrector 打开了这个问题 2016 年 2 月 8 日 · 37条评论
关闭

Python3 端口#228

ericrector 打开了这个问题 2016 年 2 月 8 日 · 37条评论

注释

Python3 端口 #228

首先感谢您为此项目付出的时间和精力!

这在哪个 python 版本下运行?我正在使用 Python 3.3.3 (v3.3.3:c3896275c0f6, Nov 18 2013, 21:19:30) [MSC v.1600 64 bit (AMD64)] on win32

当我运行脚本时,我得到了找不到的模块:
ImportError: No module named ‘ builtin ‘

我变了:

导入内置

导入内置

http://docs.pythonsprints.com/python3_porting/py-porting.html#name-changes )

然后我得到:
回溯(最近一次调用最后一次):
文件“C:\xxxxxxxxxxxxxxxxx\bCNC.py”,第 27 行,
内置._ = gettext.translation(‘bCNC’, ‘locale’, fallback=True).ugettext
AttributeError: ‘NullTranslations’ 对象没有属性 ‘ugettext’

httplib 现在也是 urllib????

你有什么建议吗?

Python3 端口 #228
贡献者

任何 2.7 版本都可以使用。努力与 3.3 一起工作,但目前不是高优先级。试一试并报告任何反馈。

Python3 端口 #228
作者

我会看看我能帮上什么忙。

Python3 端口 #228
所有者

@ericrector大多数功能已经存在于 python3 中(尚未完全测试)。主要问题来自核心发送程序,串行接口在 python3 中需要“字节”类型,字符串是 unicode,而在 python2 中需要“str”。
在不广泛使用 try: except 的情况下,我没有任何好的方法使它适用于具有相同代码的两个版本:

Python3 端口 #228

@vlachoudis我不了解相关代码的细节,但我会把它放在这里。

Python 3.5.1 (default, Feb  2 2016, 15:28:26)
>>> type("foo".encode("utf8"))
<class 'bytes'>


Python 2.7.5 (default, May 29 2013, 21:11:16)
>>> type("foo".encode("utf8"))
<type 'str'>

对 python 3 普通 unicode 字符串 (str) 进行编码会产生字节。对 python 2 常规字符串 (str) 进行编码会生成 str。对 python 2 unicode 字符串 (unicode) 进行编码会生成 str。我有一种预感,那就是你一直在寻找的方法。

Python3 端口 #228
所有者

谢谢@voneiden这可以进行转换。但是,python3 中不存在的“unicode”类型的代码中有很多检查会引发 NameError 异常。
也许一个肮脏的 hack 是创建一个等于 str 的内置类型 unicode。
有几个地方我们必须为 python2 或 python3 设置条件。
所有这些都将以混乱的代码告终。
我个人认为最好的选择是有一天完全迁移到 python3 并停止支持 python2。

Python3 端口 #228

好吧。我会尝试找一些时间坐下来熟悉代码库,也许我能想出点什么。我同意转向 python3。保留旧版 python2 支持会很好,但它对主要代码的影响应该很小。

Python3 端口 #228
所有者

我现在有点害怕跳。我想运行我希望程序具有的所有功能,然后转移到 python3。

Python3 端口 #228

好的,我会留意情况的。

Python3 端口 #228
作者

嗨,大家好,

我不是故意打开一罐蠕虫。我可以试着帮忙。我在 c、cpp 和 java 方面有很强的
背景。我对 python 很陌生。我认为
学习起来不会太难,但众所周知,找到时间是个
问题。也许有人对我们如何合作来帮助
创建 Python 3 版本提出了建议。

但如果 Vasilis 希望等待,我可以尊重。

2016 年 2 月 11 日星期四上午 11:07,Matti Eiden notifications@github.com
写道:

好的,我会留意情况的。


直接回复此电子邮件或在 GitHub
#228(评论)上查看。

Python3 端口 #228
所有者

@ericrector感谢您提供帮助。我只是想避免使用拼凑的代码来支持两个 python 版本,而我仍然有一些功能没有完全实现。我想在某个时候跳转到 python3 并停止对 python2 的支持。

我会说第一步是将所有非关键部分修改为 python2 和 python3 兼容。我已经在尝试这样做,但欢迎提供额外帮助。然后开始处理代码的关键部分并将它们仅转换为 python3(尤其是发件人)

Python3 端口 #228 vlachoudis 添加了 增强 标签 2016 年 3 月 5 日
Python3 端口 #228

在 python v2.6.6 上启动会引发最新代码错误:
$ ./bCNC.py
Traceback(最近调用最后一次):
文件“./bCNC.py”,第 2374 行,在
if sys.version_info.major != 2中:
AttributeError: ‘tuple’ 对象没有属性 ‘major’
$ python –version
Python 2.6.6


在 Python 版本 2.7.9 上,“主要”元组对象解析,所以没问题,bCNC 运行时版本检查代码没有任何问题。

Python3 端口 #228
所有者

@DasWookie感谢您的报告。我修改了代码以询问 sys.version_info[0] 而不是 .major。现在它应该也适用于 2.6

Python3 端口 #228

现在支持 3 了吗?

Python3 端口 #228
所有者

不,python 3 将需要大量的工作和测试,因为字符串现在是 unicode(2 字节),而在控制器上它必须与字节流通信。

Python3 端口 #228

@vlachoudis 我已经开始了为期 100 天的代码挑战,一旦我对一般语言更加熟悉,我就会对此进行研究。

我想知道tosend在 Sender.pydef serialIO(self)中设置字节类型是否就足够了?

Python3 端口 #228

我几乎每天都使用 bCNC,所以应该可以在我的另一台笔记本电脑上进行测试。

Python3 端口 #228

现在我看不到任何需要 Python 3 的代码。等待似乎是没有代价的。

Python3 端口 #228 哈维 改了标题 蟒蛇版? Python3 端口 2018 年 11 月 19 日
Python3 端口 #228 Harvie 将此添加到 0.9.16里程碑 2018 年 11 月 19 日
Python3 端口 #228
合作者
哈维 评论了 2018 年 11 月 22 日  

仅供我的内部记录:https ://www.root.cz/clanky/domena-cz-slavi-25-let-zacalo-to-souborem-hosts-txt/

find -name '*.py' -type f | while read i; do sed -i 's/\.\(de\|en\)code("utf8")//g' "$i"; done
python2 -m modernize -x libmodernize.fixes.fix_import -w -n --no-six .
python2 -m modernize -x libmodernize.fixes.fix_import -w -n --no-six  --future-unicode .
futurize -j 4 -w -n -1  .
futurize -j 4 -w -n -2  .
futurize -j 4 -w -n -0 -u  .
2to3-2.7 -j 4 -p -w -n -x import -x unicode .
var.encode()  #unicode to bytes
var.decode()  #bytes to unicode
>>> max(None, 1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'int' and 'NoneType'
Python3 端口 #228
真正的抵抗力 评论了 2019 年 1 月 9 日  

@Harvie我看到你做了一个分支 V3。这应该是开发/测试的位置吗?

owner@DESKTOP-75RC9P5 MINGW64 /d/bCNC/bCNC (v3)
$ python bCNC.py
Traceback (most recent call last):
  File "bCNC.py", line 1, in <module>
    __main__.py
NameError: name '__main__' is not defined

owner@DESKTOP-75RC9P5 MINGW64 /d/bCNC/bCNC (v3)
$ git branch
  master
* v3

owner@DESKTOP-75RC9P5 MINGW64 /d/bCNC/bCNC (v3)
$ python --version
Python 3.6.1

Python3 端口 #228
合作者

@atrueresistance它不是真正最新的。我们也从来没有让它正常工作。我已经设法显示主窗口,但几乎所有东西都坏了。

Python3 端口 #228
合作者

大家好消息!我想我已经解决了 python3 上 bCNC 的大部分问题。现在我需要你们在 python2 和 python3 上大量测试最新的 git master 版本,这样我们就可以确定它已经准备好发布了!

Python3 端口 #228
贡献者

我很高兴,恭喜!

Python3 端口 #228 哈维 提到了这个问题 2019 年 11 月 27 日
Python3 端口 #228
合作者

python3 中的串行通信似乎存在错误,有人可以判断它是否也影响 python2 吗?我的 gcc 有一些问题,所以我现在不能安装 grbl 来测试它。

Python3 端口 #228
贡献者
onekk 评论了 2019 年 11 月 27 日  

好的,错误在于 Sender.py 中行的编码

靠近#anything接收

`

       if self.serial.inWaiting() or tosend is None:
            try:
                line = str(self.serial.readline()).strip()
                #print("Received line > ", line)

`

注释的打印结果在 python 3 中为 b” 值(实际上是 Debian 9 中的 Python 3.5.3)。更多来..

好的,它似乎被更正了

line = str(self.serial.readline().decode('utf-8')).strip()

但是 Harvie commit 7fe44a6似乎是错误的,因为在 Python3 中(见上面的版本)它引发了一个错误:

`

self.serial.write(tosend.encode("ascii"))
AttributeError: 'bytes' object has no attribute 'encode'

`

sorry 但是代码插入不正确有时候我不得不多次修改帖子,似乎与换行有关,如何在帖子中正确插入代码?

问候

卡罗·D。

Python3 端口 #228
贡献者
onekk 评论了 2019 年 11 月 27 日  

`

           try:
                self.serial.write(tosend.encode())
            except AttributeError:
                self.serial.write(tosend)

`

这似乎解决了混合问题,一些生成为 str,一些生成为 byte,因此如果它是 byte,encode() 将因属性错误而失败。

很抱歉没有发送正确的行,但我正在测试我的程序版本,但 SerialIO 没有受到影响,除了添加了一些 print() 语句以尝试了解它是如何工作的。

使用 python 2 = 2.7.13 和 python3 = 3.5.3 在 Debian 9 上测试

问候

卡罗·D。

Python3 端口 #228
合作者

我认为我们需要一些围绕 serial.write() 的包装器,因此我们不必将 try/catch 语句放在各处。

Python3 端口 #228
贡献者
onekk 评论了 2019 年 11 月 27 日  

是的,分析 tosend 类型并采取相应行动可能会更好:

`

            print("serial to send > ", tosend)
            print("serial to send type> ", type(tosend))

`

如果你在 try: except part 之前添加这两行,你会发现一些“行”作为 str() 传递,另一些作为字节 b” 传递,如何找出这些行来自哪里?

从命令行查看此序列:

要发送的串行 > $#

串行发送类型> <class ‘str’>
串行发送 > $G

串行发送类型> <class ‘str’>
串行发送 > $J=G91 X10.000000 Y10.000000 F100000

serial to send type> <class ‘str’>
serial to send > b’$G\n’
serial to send type> <class ‘bytes’>
控制器状态更改为:Jog (Running: False)
Traceback (最近一次调用最后一次):
文件“OKKCNC/ main .py”,第 2813 行,在 monitorSerial
self._monitorSerial()
文件“OKKCNC/ main .py”,第 2641 行,在 _monitorSerial
line = line.rstrip(“\n”)
TypeError:一个字节-like object is required, not ‘str’
控制器状态更改为:Idle (Running: False)
serial to send > $#

`

说到python3

问候

卡罗·D。

Python3 端口 #228
贡献者
onekk 评论了 2019 年 11 月 27 日  

对于一些处理 python 差异的代码,我已经解决了在我的案例 OCV 中设置从模块导入的“全局”var。

当您测试 python 2 或 3 时,首先将 IS_PY3 设置为 True,在 OCV 模块中将其设置为 False,因此如果未检测到 python3,则假定为 else 值

例如,这里有一部分代码处理字典,如 python2 > 2.7 viewitems 在 python3 中作为 items() 工作

如本说明所述:

dict.viewkeys()、dict.viewvalues() 和 dict.viewitems() 返回的对象是视图对象。它们提供字典条目的动态视图,这意味着当字典发生变化时,视图会反映这些变化。


       if OCV.IS_PY3:
           iterlist = OCV.PLANE.items()
       else:
           iterlist = OCV.PLANE.viewitems()

       for key, val in iterlist:
           bal_text += "{0} > {1}\n".format(key, val)

此代码导致此行为:

Python3 端口 #228

也许为了应对微妙地方的不同行为,可以使用类似的方法。


另一个 mod 可以像这样使用 Tk 的导入:


try:
    import Tkinter as Tk
    import tkMessageBox
except ImportError:
    import tkinter as Tk
    import tkinter.messagebox as tkMessageBox


这涉及更改所有以 Tk 为前缀的 Tk 调用,这是一项漫长的工作,但代码可读性得到提高,现在很清楚 Tk.END 来自 Tk 模块等等,使用正确的编辑器可以修改文件十分钟或更短时间。

问候

卡罗·D。

Python3 端口 #228
贡献者
onekk 评论了 2019 年 11 月 28 日  

Sender.py 的这个 sendGcode 类

似乎适用于 python3 和 Python2

“““Python

def sendGCode(self, cmd):
    """
    Send to controller a gcode or command
    WARNING: it has to be a single line!
    """
    if self.serial and not self.running:
        c_type = type(cmd)
        if OCV.DEBUG is True:
            print("Cmd      > ", cmd)
            print("Cmd type > ", c_type)

        if isinstance(cmd, tuple):
            self.queue.put(cmd)
        elif isinstance(cmd, str):
            self.queue.put(cmd + "\n")
        else:
            self.queue.put(cmd + b"\n")

“””

抱歉代码污染,但它符合 PEP8 文档字符串标准,并使用我的全局变量样式按需激活一些 degug 输出。

问候

卡罗·D。

Python3 端口 #228
合作者
哈维 评论了 2019 年 11 月 28 日  

Sender.py我已经添加serial_write()了. serial.write()所以我们可以在一个地方解决这个问题。但我无法让它在 python3 中工作。pyserial 中似乎存在 catch-22 问题:pyserial/pyserial#467有什么解决办法吗?

包装器在 bCNC 代码中无处不在。看起来像这样,到目前为止它似乎在 python2 中工作。但无法让 serial.write() 在 python3 上运行:

        def serial_write(self, data):
                #print("W "+str(type(data))+" : "+str(data))

                if sys.version_info[0] == 2: 
                        ret = self.serial.write(str(data))
                else:
                        ret = self.serial.write("hello".encode()) 

                return ret
喜欢 (0)