我一直在使用python构建运行socket.io和aiohttp的Windows服务。该程序可以在解释器中完美运行,但是一旦我使用pyinstaller将其打包到exe文件中,代码就会失败,并出现以下异常:
Traceback (most recent call last):
File "autocoreserver.py", line 24, in __init__
File "site-packages\socketio\asyncio_server.py", line 67, in __init__
File "site-packages\socketio\server.py", line 89, in __init__
File "site-packages\engineio\server.py", line 123, in __init__
ValueError: Invalid async_mode specified
在我的程序中,尝试创建AsyncServer时会引发异常(文件“ autocoreserver.py”, init 中的第24行)。
try:
self.sio = socketio.AsyncServer()
except:
rootLogger.exception("AsyncServer init")
我已经在线研究过,并且知道这是一个常见问题,通常可以使用spec文件中的hiddenimports参数解决。但是,添加了所有可以在网上找到的建议后,该错误没有改变。
要尝试查找缺少的模块,我使用“ -v”选项构建了exe。但是,列出了许多模块,其中几乎没有一个与socket.io或aiohttp有关。例如,缺少许多Qt模块,但这是一项没有用户界面的服务,我没有使用Qt。
为了精确定位所需的模块列表,我将此代码添加到了程序中,该代码列出了所有正在使用的模块并将它们写到文件中。
f = open('c:\\modulereport.log','w')
f.write('hiddenimports=[\n')
mods = [m.__name__ for m in sys.modules.values() if m]
for m in mods:
f.write( ' \'{0}\',\n'.format(m) )
f.write("],")
f.close()
这给了我该程序正在使用的每个模块的清单,但缺少了几个。当我重新添加所有我知道丢失的模块时,我又回到了相同的错误。
我是pyinstaller和python的新手,我猜想有一种更好的方法来确定缺少的模块。谁能告诉我找到缺少的模块的最佳方法吗?
这是我的规格文件(build.spec):
# -*- mode: python -*-
block_cipher = None
#options = [ ('v', None, 'OPTION') ]
options = []
a = Analysis(['autocoreservice.py'],
pathex=['C:\\Users\\ThomasBitskyJr\\Documents\\srcroot\\3182TeeTable\\AutoCore-Server'],
binaries=[],
datas=[],
hiddenimports=[
'win32timezone',
'engineio.async_gevent',
'gevent',
'gevent-websocket',
'aiohttp'
],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
options,
a.binaries,
a.zipfiles,
a.datas,
name='autocoreservice',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )
我使用以下命令构建exe:
pyinstaller --onefile build.spec
版本信息:
python --version
Python 3.6.5 :: Anaconda, Inc.
pip --version
pip 18.0 from c:\users\thomasbitskyjr\anaconda3\lib\site-packages\pip (python 3.6)
pyinstaller --version
3.3.1
预先感谢您的任何建议。
更新:我通过更新系统上的所有模块来改善了这种情况。这将错误移至该过程的后期。现在我得到了:
Traceback (most recent call last):
File "C:\Users\User\Documents\srcroot\autocoreserver.py", line 30, in __init__
self.sio.attach(self.app)
File "C:\Users\User\Anaconda3\lib\site-packages\socketio\asyncio_server.py", line 74, in attach
self.eio.attach(app, socketio_path)
File "C:\Users\User\Anaconda3\lib\site-packages\engineio\asyncio_server.py", line 64, in attach
self._async['create_route'](app, self, '/{}/'.format(engineio_path))
KeyError: 'create_route'
我已经尝试了pyinstaller和cx_Freeze并获得相同的结果。
答案 0 :(得分:0)
我没有任何好的故障排除技巧,但是我能够解决此确切的错误。我的研究主要显示该问题是由于隐藏的进口造成的,但是要找到隐藏的内容是一个猜测和检查。因为是发生错误的引擎,所以我在站点软件包中进行了一些侦听,以查看软件包目录的设置,并提出了以下命令,并带有标记以包括丢失的软件包
pyinstaller <your_script>.py --hidden-import engineio.async_drivers.aiohttp --hidden-import engineio.async_aiohttp --distpath some/dist/dir