-
Notifications
You must be signed in to change notification settings - Fork 228
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【公告】bilibili_api PyInstaller 打包相关 #39
Comments
用py脚本可以连接到服务器,pyinstaller打包后无法连接至服务器。错误信息如下:
查询“stdlib ssl module not available”,找到SSL module is not available,按照指示在此下载安装重启电脑后重试,仍无效。 又尝试了 一顿定位应该是发生在live.py 943行 pyinstaller日志如下
程序源代码如下: import sys
from PyQt5.QtWidgets import QMainWindow, QTextEdit, QLineEdit, QVBoxLayout, QWidget
from PyQt5.QtCore import Qt
from time import strftime
from concurrent.futures import ThreadPoolExecutor
import pyttsx4
from bilibili_api import live
import asyncio
import qasync
import os
import logging
import json
class Window(QMainWindow):
def __init__(self):
super().__init__()
# 朗读功能
self.pool = ThreadPoolExecutor(max_workers=1)
self.speak = lambda text: self.pool.submit(pyttsx4.speak, text)
# 初始化UI
self.setupUI()
def setupUI(self):
self.setWindowTitle('tts')
self.setStyleSheet("background-color: transparent;") # 设置窗口背景为透明
self.resize(300, 500)
self.text_box = QTextEdit(self)
self.text_box.setReadOnly(True)
self.text_box.setStyleSheet('color:white')
self.entry = QLineEdit(self)
self.entry.returnPressed.connect(self.on_enter)
self.entry.setStyleSheet('color:white')
self.layout = QVBoxLayout()
self.layout.addWidget(self.text_box)
self.layout.addWidget(self.entry)
self.widget = QWidget(self)
self.widget.setLayout(self.layout)
self.setCentralWidget(self.widget)
self.entry.setFocus(Qt.FocusReason.OtherFocusReason)
def log_and_speak(self, text:str, read:str=None):
# 发送到聊天框
self.text_box.append(f"[{strftime('%H:%M:%S')}] {text}")
# 朗读信息
self.speak(text if read is None else read)
def on_enter(self):
if self.entry.text() != "":
self.log_and_speak(self.entry.text())
self.entry.clear()
async def main():
# basic
window = Window()
window.show()
roomid = os.path.basename(sys.argv[0]).split('.')[0]
room = live.LiveDanmaku(roomid)
# log
file_handler = logging.FileHandler(filename=f'{roomid}.log', mode='a', encoding='utf8')
file_handler.setFormatter(logging.Formatter(fmt='%(asctime)s - %(levelname)s: %(message)s'))
file_handler.setLevel(logging.DEBUG)
logger = logging.getLogger(f'{roomid}')
logger.setLevel(logging.DEBUG)
logger.addHandler(file_handler)
@room.on('DANMU_MSG')
async def on_DANMU_MSG(event):
# 收到弹幕
uname = event['data']['info'][2][1]
text = event['data']['info'][1]
window.log_and_speak(f'{uname}:{text}', f'{uname}说:{text}')
@room.on('SEND_GIFT')
async def on_SEND_GIFT(event):
# 收到礼物'
uname = event['data']['data']['uname']
action = event['data']['data']['action']
giftName = event['data']['data']['giftName']
num = event['data']['data']['num']
window.log_and_speak(f'{uname} {action} {giftName},数量 {num}')
@room.on('INTERACT_WORD')
async def on_INTERACT_WORD(event):
# 有人进入直播间
uname = event['data']['data']['uname']
window.log_and_speak(f'{uname} 进入直播间')
@room.on('LIVE')
async def on_LIVE(event):
# 直播开始
roomid = event['data']['roomid']
window.log_and_speak(f'直播开始,房间号{roomid}')
@room.on('VERIFICATION_SUCCESSFUL')
async def on_VERIFICATION_SUCCESSFUL(event):
# 成功连接到直播间
room_display_id = event['room_display_id']
window.log_and_speak(f'已成功连接至房间:{room_display_id}')
@room.on('ALL')
async def on_all(event):
# 日志
logger.info(json.dumps(event))
await room.connect()
if __name__ == "__main__":
try:
qasync.run(main())
except asyncio.exceptions.CancelledError:
sys.exit(0) |
解决了。去翻了pyinstaller的和aiohttp相关的issue,偶然发现一个维护者怒骂conda,于是下了个官方版的python3.9(不是最新版是为了配合qasync模块),再打包pyinstaller,可以建立网络连接了。 |
微软语音模块的问题,我也遇到了,并且搜到了解决方法,我用的是pyttsx4,所以正好能解决。 pyttsx4中有一段这样的代码 # import driver module
name = 'pyttsx4.drivers.%s' % driverName
self._module = importlib.import_module(name) 估计是importlib这个操作导致pyinstaller无法识别。如果用win32com的话可能会有类似的解法吧。 |
bilibili_api 在 pyinstaller 打包的时候需要把许多的数据(如分区数据、API 数据)打进 exe 文件里面,目前 setup.py 已经添加了在 Pyinstaller 打包的时候自动把 bilibili_api 的相关文件打包进去的功能。
如果你在运行打包后的
exe
程序时出现:'NoneType' object is not subscriptable
,则代表 bilibili_api 的数据没有打包进去。请按照如下步骤解决:dist-packages
目录或site-packages
目录)python 模块目录/PyInstaller/hooks
下新建文件hook-bilibili_api.py
。hook-bilibili_api.py
文件中写入:执行完以下步骤一般就能解决问题了。如果你的问题仍然没有解决,请发出你的
exe 文件的错误
,PyInstaller 日志
, 以便解决问题。The text was updated successfully, but these errors were encountered: