我开发了一个用于与数字泵进行串行通信的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进行了测试。
答案 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://")
在这个小的解决方法之后,它运行良好。