pyinstaller打包fastapi/uvicorn后运行报错。
报错内容
因为当使用PyInstaller 的 --windowed打包后就没有输出框使用了,代码中“sys.stdout” 也就变成了None导致uvicorn中有一行代码sys.stdout.isatty()报错。解决方案也非常简单,不会影响以前写的代码(在下面)。
Traceback (most recent call last):
File "logging\config.py", line 542, in configure
File "logging\config.py", line 654, in configure_formatter
File "logging\config.py", line 473, in configure_custom
File "uvicorn\logging.py", line 42, in __init__
AttributeError: 'NoneType' object has no attribute 'isatty'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "main.py", line 11, in <module>
File "uvicorn\main.py", line 522, in run
File "uvicorn\config.py", line 285, in __init__
File "uvicorn\config.py", line 393, in configure_logging
File "logging\config.py", line 808, in dictConfig
File "logging\config.py", line 545, in configure
ValueError: Unable to configure formatter 'default'
Traceback (most recent call last):
File "main.py", line 3, in <module>
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "PyInstaller\loader\pyimod02_importers.py", line 391, in exec_module
File "app.py", line 6, in <module>
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "PyInstaller\loader\pyimod02_importers.py", line 391, in exec_module
File "apis.py", line 8, in <module>
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "PyInstaller\loader\pyimod02_importers.py", line 391, in exec_module
File "modules\app\wen_search\apis\__init__.py", line 10, in <module>
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "PyInstaller\loader\pyimod02_importers.py", line 391, in exec_module
File "modules\app\wen_search\apis\file_api.py", line 10, in <module>
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "PyInstaller\loader\pyimod02_importers.py", line 391, in exec_module
File "libs\utils\logger.py", line 27, in <module>
File "libs\utils\logger.py", line 13, in __init__
File "loguru\_logger.py", line 865, in add
TypeError: Cannot log to objects of type 'NoneType'
解决方案
判断如果sys.stdout为空时,重新定义一个sys.stdout示例即可。
1、创建一个py文件
import sys
if not sys.stdout:
class FakeStdOut:
def __init__(self, filename="sys.log"):
self.log = open(filename, "a")
def write(self, message):
# 我这里把原本打印到控制台的内容,写到了sys.log文件中,也可以不写直接pass
self.log.write(message)
def flush(self):
pass
def isatty(self):
return True
sys.stdout = FakeStdOut()
2、直接在项目入口文件中引入如上py即可
我上面创建的文件叫sys_redirect ,在入口直接引入就可以了。
import libs.utils.sys_redirect
import uvicorn
from libs.utils.file import get_config
import libs.utils.sys_redirect # 在这里引入上边的py文件即可
import app # 引入后打包自动引入 , 不引入打包时找不到app.py。
if __name__ == "__main__":
config = get_config()
uvicorn.run(app="app:app", host="0.0.0.0", port=config.port, reload=False)
3、点个赞❤❤❤
有什么问题可以发到评论区一起交流。