可执行的包含serial_for_url的脚本

时间:2014-07-10 18:41:18

标签: python py2exe pyserial canopy

我开发了一个用于与数字泵进行串行通信的python脚本。我现在需要用它来制作一个可执行文件。然而,即使它在使用python和py2exe运行时效果非常好,但在运行可执行文件时会正确生成.exe,会发生以下错误:

File: pump_model.pyc in line 96 in connect_new
File: serial\__init__.pyc in line 71 in serial_for_url
ValueError: invalid URL protocol 'loop' not known

我的代码的相关部分如下:     #新的串口连接     def connect_new(self,port_name):         msgstr“”“用于配置新串行连接的功能。”“”

    try:
        self.ser = serial.Serial(port = port_name,\
                baudrate = 9600,\
                parity = 'N',\
                stopbits = 1,\
                bytesize = 8,\
                timeout = self.timeout_time)
    except serial.SerialException:
        self.ser = serial.serial_for_url('loop://',\
              timeout = self.timeout_time) # This line BLOWS!
    except:
        print sys.exc_info()[0]

    finally:
        self.initialize_pump()

我应该注意,该应用程序是用OSX编写的,并在Windows上使用Canopy Python Distribution进行了测试。

2 个答案:

答案 0 :(得分:1)

我遇到了与#34; socket://"完全相同的问题。而不是" loop://"

我无法获得已接受的工作答案,但以下内容似乎已成功:

1)添加明确导入有问题的urlhandler。* module

import serial

# explicit import for py2exe - to fix "socket://" url issue
import serial.urlhandler.protocol_socket 

# explicit import for py2exe - to fix "loop://" url issue (OP's particular prob)
import serial.urlhandler.protocol_loop

# use serial_for_url in normal manner
self._serial = serial.serial_for_url('socket://192.168.1.99:12000')

2)为py2exe生成一个设置脚本(参见https://pypi.python.org/pypi/py2exe/) - 我已经将py2exe安装到了virtualenv:

path\to\env\Scripts\python.exe -m py2exe myscript.py -W mysetup.py

3)编辑mysetup.py以包含选项

zipfile="library.zip" # default generated value is None

(另见http://www.py2exe.org/index.cgi/ListOfOptions

3)建立它:

path\to\env\Scripts\python.exe mysetup.py py2exe

4)运行它

dist\myscript.exe

答案 1 :(得分:0)

发现它!

似乎由于某种原因,循环://'在.exe制作之后,争论无法得到承认。

我通过研究pyserial / init .py脚本得出结论,当发出命令serial.serial_for_url('loop://')时,你基本上调用: sys.modules中[' serial.urlhandler.protocol_loop”]串行。(“循环://“)

所以你必须先导入serial.urlhandler.protocol_loop 然后发出该命令代替一个故障。 所以你现在可以输入:

__import__('serial.urlhandler.protocol_loop')
sys.modules[‘serial.urlhandler.protocol_loop’].Serial("loop://")

在这个小的解决方法之后,它运行良好。