pyinstaller:确定Windows服务中的socket.io和aiohttp隐藏的导入

时间:2018-08-21 18:10:35

标签: python pyinstaller

我一直在使用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并获得相同的结果。

1 个答案:

答案 0 :(得分:0)

我没有任何好的故障排除技巧,但是我能够解决此确切的错误。我的研究主要显示该问题是由于隐藏的进口造成的,但是要找到隐藏的内容是一个猜测和检查。因为是发生错误的引擎,所以我在站点软件包中进行了一些侦听,以查看软件包目录的设置,并提出了以下命令,并带有标记以包括丢失的软件包

pyinstaller <your_script>.py --hidden-import engineio.async_drivers.aiohttp --hidden-import engineio.async_aiohttp  --distpath some/dist/dir