When I start the server.exe
and it is trying to perform uvicorn.run()
, the exception is being thrown:
<
I encountered the same problem. And I found it's a job of hiddenimports
,It's useful to modify the following lines in xxx.spec
:
a = Analysis(['xxx.py'],
hiddenimports=['uvicorn.logging'],
<everything else>)
however, there will still be other similar problems. So, I try to add all files of uvicorn
,and it works with:
hiddenimports=['uvicorn.lifespan.off','uvicorn.lifespan.on','uvicorn.lifespan',
'uvicorn.protocols.websockets.auto','uvicorn.protocols.websockets.wsproto_impl',
'uvicorn.protocols.websockets_impl','uvicorn.protocols.http.auto',
'uvicorn.protocols.http.h11_impl','uvicorn.protocols.http.httptools_impl',
'uvicorn.protocols.websockets','uvicorn.protocols.http','uvicorn.protocols',
'uvicorn.loops.auto','uvicorn.loops.asyncio','uvicorn.loops.uvloop','uvicorn.loops',
'uvicorn.logging'],
then, run:
pyinstaller xxx.spec
More universal way is too specify the hook:
# extra-hooks/hooks-uvicorn.py
from PyInstaller.utils.hooks import collect_submodules
hiddenimports = collect_submodules('uvicorn')
And run pyinstaller with --additional-hooks-dir extra-hooks
. For example:
pyinstaller -y --clean --additional-hooks-dir extra-hooks main.py
But!
If you are using websockets
lib just like me. You will face the error:
File "uvicorn\protocols\websockets\websockets_impl.py", line 24, in <module>
AttributeError: module 'websockets' has no attribute 'WebSocketServerProtocol'
[1844] Failed to execute script main
For this I've found another solution. Add whole uvicorn's dir itself:
# extra-hooks/hooks-uvicorn.py
from PyInstaller.utils.hooks import get_package_paths
datas = [(get_package_paths('uvicorn')[1], 'uvicorn')]
And build exe with the above command.