python 打包时候遇到 'utf-8' codec can't decode byte 0xd7 in position 2556: invalid continuation byte

问题遇到的现象和发生背景

今天尝试用tushare写了一个股票的监听脚本,但是想打包成exe的时候就报了 'utf-8' codec can't decode byte 0xd7 in position 2556: invalid continuation byte 这个错误

问题相关代码,请勿粘贴截图

这个是完整代码

import tushare as ts
import datetime
import sys
import time
import schedule
import smtplib
from email.mime.text import MIMEText


def get_now_jiage(code):
    df = ts.get_realtime_quotes(code)[['name', 'price', 'pre_close', 'date', 'time']]
    return df


def pd_ztjytime():
    now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    now_datetime = datetime.datetime.strptime(now_time, '%Y-%m-%d %H:%M:%S')
    d1 = datetime.datetime.strptime(datetime.datetime.now().strftime('%Y-%m-%d') + ' 11:30:01', '%Y-%m-%d %H:%M:%S')
    d2 = datetime.datetime.strptime(datetime.datetime.now().strftime('%Y-%m-%d') + ' 13:00:00', '%Y-%m-%d %H:%M:%S')
    delta1 = (now_datetime - d1).total_seconds()
    delta2 = (d2 - now_datetime).total_seconds()
    if delta1 > 0 and delta2 > 0:
        return True
    else:
        return False


def do_programe(code, cbj, shuliang, e_mail):
    if not pd_ztjytime():
        info = get_now_jiage(code)
        now_jiage = float(info['price'][0])
        name = info['name'][0]
        pre_close = float(info['pre_close'][0])
        riqi = info['date'][0]
        sj = info['time'][0]
        now_zdie = round((now_jiage - pre_close) / pre_close * 100, 2)
        all_zdie = round((now_jiage - cbj) / cbj * 100, 2)
        now_shizhi = round(shuliang * now_jiage, 2)
        ykui = round(now_shizhi - cbj * shuliang, 2)
        if (3 <= abs(now_zdie) < 3.09) or (6 <= abs(now_zdie) < 6.05) or (9 <= abs(now_zdie) < 9.1):
            email_comment = ['<html>', '<b><p><h3><font size="2" color="black">您好:</font></h4></p></b>',
                             '<p><font size="2" color="#000000">根据设置参数,现将监控到' + name + '(' + str(
                                 code) + ')的证券价格异动消息汇报如下:</font></p>',
                             '<table border="1px" cellspacing="0px"   width="600" style="border-collapse:collapse">',
                             '<tr>', '<td align="center"><b>序号</b></td>', '<td align="center"><b>购买单价</b></td>',
                             '<td align="center"><b>持股数</b></td>', '<td align="center"><b>现价</b></td>',
                             '<td align="center"><b>现涨跌幅</b></td>', '<td align="center"><b>总涨跌幅</b></td>',
                             '<td align="center"><b>现市值</b></td>', '<td align="center"><b>盈亏额</b></td>',
                             '<td align="center"><b>异动时间</b></td>', '</tr>', '<tr>',
                             '<td align="center">' + str(1) + '</td>', '<td align="center">' + str(cbj) + '</td>',
                             '<td align="center">' + str(shuliang) + '</td>',
                             '<td align="center">' + str(now_jiage) + '</td>',
                             '<td align="center">' + str(now_zdie) + '%</td>',
                             '<td align="center">' + str(all_zdie) + '%</td>',
                             '<td align="center">' + str(now_shizhi) + '元</td>',
                             '<td align="center">' + str(ykui) + '元</td>',
                             '<td align="center">' + str(riqi) + ' ' + str(sj) + '</td>', '</tr>', '</table>',
                             '<p><font size="2" color="black">祝:股市天天红,日日发大财!</font></p>', '</html>']

            send_msg = '\n'.join(email_comment)
            sendEmail(e_mail, send_msg)


def sendEmail(e_mail, content):

    mail_host = "smtp.163.com"
    mail_user = "帐号"
    mail_pass = "密码"

    sender = '发送邮箱'
    receivers = [
        e_mail
    ]

    title = '股市监听机器人'
    message = MIMEText(content, 'html', 'utf-8')
    message['From'] = "{}".format(sender)
    message['To'] = ",".join(receivers)
    message['Subject'] = title

    try:
        smtpObj = smtplib.SMTP_SSL(mail_host, 465)
        smtpObj.login(mail_user, mail_pass)
        smtpObj.sendmail(sender, receivers, message.as_string())
        print("邮件发送成功,注意查收")
    except smtplib.SMTPException as e:
        print(e)


def run(code, price, num, e_mail):
    while True:

        do_programe(code, price, num, e_mail)
        now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        d1 = datetime.datetime.strptime(now_time, '%Y-%m-%d %H:%M:%S')
        d2 = datetime.datetime.strptime(datetime.datetime.now().strftime('%Y-%m-%d') + ' 15:00:00', '%Y-%m-%d %H:%M:%S')
        delta = d2 - d1
        if delta.total_seconds() <= 0:
            sys.exit()
        time.sleep(1)


if __name__ == '__main__':
    print("本脚于每日9:30至15:00进行监听")
    code = input("请输入需要监控的股票编号")
    price = input("请输入买入单价")
    num = input("请输入持股数")
    e_mail = input("请输入邮箱")

    schedule.every().day.at("09:30").do(run(str(code), float(price), num, str(e_mail)))
    while True:
        schedule.run_pending()
        time.sleep(1)
运行结果及报错内容

这个是完整的报错信息

Traceback (most recent call last):
  File "F:\python\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "F:\python\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "E:\www_py\venv\Scripts\pyinstaller.exe\__main__.py", line 7, in <module>
  File "e:\www_py\venv\lib\site-packages\PyInstaller\__main__.py", line 124, in run
    run_build(pyi_config, spec_file, **vars(args))
  File "e:\www_py\venv\lib\site-packages\PyInstaller\__main__.py", line 58, in run_build
    PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\building\build_main.py", line 782, in main
    build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))
  File "e:\www_py\venv\lib\site-packages\PyInstaller\building\build_main.py", line 714, in build
    exec(code, spec_namespace)
  File "E:\www_py\机器人.spec", line 19, in <module>
    noarchive=False)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\building\build_main.py", line 277, in __init__
    self.__postinit__()
  File "e:\www_py\venv\lib\site-packages\PyInstaller\building\datastruct.py", line 155, in __postinit__
    self.assemble()
  File "e:\www_py\venv\lib\site-packages\PyInstaller\building\build_main.py", line 439, in assemble
    priority_scripts.append(self.graph.add_script(script))
  File "e:\www_py\venv\lib\site-packages\PyInstaller\depend\analysis.py", line 265, in add_script
    self._top_script_node = super().add_script(pathname)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1433, in add_script
    self._process_imports(n)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2850, in _process_imports
    target_module = self._safe_import_hook(*import_info, **kwargs)[0]
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2303, in _safe_import_hook
    target_attr_names=None, level=level, edge_attr=edge_attr)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1506, in import_hook
    source_package, target_module_partname, level)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1685, in _find_head_package
    target_module_headname, target_package_name, source_package)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\depend\analysis.py", line 387, in _safe_import_module
    return super()._safe_import_module(module_basename, module_name, parent_package)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2062, in _safe_import_module
    self._process_imports(n)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2850, in _process_imports
    target_module = self._safe_import_hook(*import_info, **kwargs)[0]
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2303, in _safe_import_hook
    target_attr_names=None, level=level, edge_attr=edge_attr)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1518, in import_hook
    submodule = self._safe_import_module(head, mname, submodule)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\depend\analysis.py", line 387, in _safe_import_module
    return super()._safe_import_module(module_basename, module_name, parent_package)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2062, in _safe_import_module
    self._process_imports(n)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2850, in _process_imports
    target_module = self._safe_import_hook(*import_info, **kwargs)[0]
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2303, in _safe_import_hook
    target_attr_names=None, level=level, edge_attr=edge_attr)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1518, in import_hook
    submodule = self._safe_import_module(head, mname, submodule)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\depend\analysis.py", line 387, in _safe_import_module
    return super()._safe_import_module(module_basename, module_name, parent_package)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2062, in _safe_import_module
    self._process_imports(n)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2850, in _process_imports
    target_module = self._safe_import_hook(*import_info, **kwargs)[0]
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2303, in _safe_import_hook
    target_attr_names=None, level=level, edge_attr=edge_attr)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1518, in import_hook
    submodule = self._safe_import_module(head, mname, submodule)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\depend\analysis.py", line 387, in _safe_import_module
    return super()._safe_import_module(module_basename, module_name, parent_package)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2062, in _safe_import_module
    self._process_imports(n)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2850, in _process_imports
    target_module = self._safe_import_hook(*import_info, **kwargs)[0]
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2303, in _safe_import_hook
    target_attr_names=None, level=level, edge_attr=edge_attr)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1518, in import_hook
    submodule = self._safe_import_module(head, mname, submodule)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\depend\analysis.py", line 387, in _safe_import_module
    return super()._safe_import_module(module_basename, module_name, parent_package)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2053, in _safe_import_module
    (module, co) = self._load_module(module_name, pathname, loader)
  File "e:\www_py\venv\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2143, in _load_module
    src = loader.get_source(partname)
  File "<frozen importlib._bootstrap_external>", line 783, in get_source
  File "<frozen importlib._bootstrap_external>", line 566, in decode_source
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd7 in position 2556: invalid continuation byte
我的解答思路和尝试过的方法

已经输入了chcp 65001 和 移除所有注释但是仍然报错

我想要达到的结果

试试在代码开头加# encoding = utf-8

有没有可能是版本问题

img

img

专门注册账户来回答你这个问题:
你使用的 tushare 的版本是 1.2.78 (Dec 12 2021 发布的),如果你没有用特别的功能。
建议把 tushare 和 pyinstaller 的版本都降低一点:

# 启动你的python env,安装旧版本
pip uninstall tushare pyinstaller
pip install tushare==1.2.62
pip installer pyinstaller==4.4

类似的问题可以尝试,切换 python 版本,或者降低package的版本来试一试,改源码的话也可以,不过有点得不偿失。
题主可以去 Github 提个Issue,也许开发团队稍后可以修正这个问题:

https://github.com/waditu/tushare

降低tushare的版本会打包成功,但是tushare请求数据的时候,会提示403错误

我现在用的是1.2.84,一样提示错误如下
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd7 in position 2556: invalid continuation byte

问题解决了么?我也碰到了同样的问题