【问题标题】:Why do I get AttributeError: type object 'Placeholder' has no attribute 'loads', when running pyisntaller?为什么在运行 pyinstaller 时出现 AttributeError: type object \'Placeholder\' has no attribute \'loads\'?
【发布时间】:2022-09-28 05:18:10
【问题描述】:

我在 Windows 11 上使用 Python 3.10.6,pip 22.2.2

我有一个程序,它使用 yfinance 来获取股票数据和 sklearn.svr 来预测股票数据。我想用 pyisntaller 把这个程序变成一个 .exe 文件。 Pyinstaller 完成并创建了 .exe 文件,但是当我想运行它时,我得到:

 File \"PyInstaller\\loader\\pyimod02_importers.py\", line 493, in exec_module
  File \"requests_cache\\__init__.py\", line 7, in <module>
  File \"<frozen importlib._bootstrap>\", line 1027, in _find_and_load
  File \"<frozen importlib._bootstrap>\", line 1006, in _find_and_load_unlocked
  File \"<frozen importlib._bootstrap>\", line 688, in _load_unlocked
  File \"PyInstaller\\loader\\pyimod02_importers.py\", line 493, in exec_module
  File \"requests_cache\\backends\\__init__.py\", line 7, in <module>
  File \"<frozen importlib._bootstrap>\", line 1027, in _find_and_load
  File \"<frozen importlib._bootstrap>\", line 1006, in _find_and_load_unlocked
  File \"<frozen importlib._bootstrap>\", line 688, in _load_unlocked
  File \"PyInstaller\\loader\\pyimod02_importers.py\", line 493, in exec_module
  File \"requests_cache\\backends\\base.py\", line 18, in <module>
  File \"<frozen importlib._bootstrap>\", line 1027, in _find_and_load
  File \"<frozen importlib._bootstrap>\", line 1006, in _find_and_load_unlocked
  File \"<frozen importlib._bootstrap>\", line 688, in _load_unlocked
  File \"PyInstaller\\loader\\pyimod02_importers.py\", line 493, in exec_module
  File \"requests_cache\\serializers\\__init__.py\", line 6, in <module>
  File \"<frozen importlib._bootstrap>\", line 1027, in _find_and_load
  File \"<frozen importlib._bootstrap>\", line 1006, in _find_and_load_unlocked
  File \"<frozen importlib._bootstrap>\", line 688, in _load_unlocked
  File \"PyInstaller\\loader\\pyimod02_importers.py\", line 493, in exec_module
  File \"requests_cache\\serializers\\preconf.py\", line 122, in <module>
  File \"requests_cache\\serializers\\pipeline.py\", line 44, in __init__
  File \"requests_cache\\serializers\\pipeline.py\", line 44, in <listcomp>
AttributeError: type object \'Placeholder\' has no attribute \'loads\'

当 pyisntaller 构建 .exe 文件时,我得到:

587 WARNING: Failed to collect submodules for \'pkg_resources._vendor.pyparsing.diagram\' because importing \'pkg_resources._vendor.pyparsing.diagram\' raised: AttributeError: module \'railroad\' has no attribute \'DiagramItem\'

所以我认为问题是因为matplotlib?我最后用它来绘制预测价格。

我在我的程序中使用的导入是:

import yfinance as yf
import requests_cache
import numpy as np
from sklearn.svm import SVR 
import matplotlib.pyplot as plt
import datetime as dt 

我通过移动到正确的目录来运行程序,然后运行:

pyinstaller --onefile -w stockPredictor.py

  • 第一个错误似乎与请求缓存有关。我遇到了同样的错误,尝试在我的应用程序中禁用请求缓存,该错误消失了。不幸的是,就我而言,我的应用程序仍未启动,但现在我没有收到任何错误消息。

标签: python error-handling pip pyinstaller


【解决方案1】:

更新:

看起来根本原因是 PyInstaller 无法从 cattrs 库中检测到 cattr.preconf 子包的使用,无论是否安装了任何可选依赖项。目前有三种可能的解决方法:

  • 使用最新的 requests-cache 预发布版本(当前为1.0.0a2
  • 在您的应用程序中添加显式import cattr.preconf.json
  • 在 PyInstaller 规范中添加 hiddenimports=['cattr.preconf.json']

原始信息:

看起来这发生在requests-cache,发生了一些不同的事情:

  1. 缺少可选依赖项,对于替代cache backendsserializers 之一。
  2. 存在一个错误,导致引发AttributeError 而不是正确的ImportError
    • 更长的版本:错误中提到的Placeholder 类用于包装ImportError,因此只有在实际使用使用该可选依赖项的功能时才会引发它(而不是在导入时引发它)。某些东西在该对象上调用.loads() 的事实可能意味着这是一些奇怪的极端情况,实际的 HTTP 请求成功,但缓存响应的序列化失败。这可能表明缺少与序列化相关的依赖项。
  3. WARNING: Failed to collect submodules 消息似乎无关。

    一些事情要尝试:

    • 将请求缓存更新到最新版本(当前为 v0.9.6)。这至少应该导致显示正确的ImportError
    • 如果您使用不同的缓存后端(默认 SQLite 除外),请确保为其安装任何可选的依赖项。对于测试,您可以pip install requests-cache[all] 获取所有可选依赖项。
    • 如果您仍然收到该错误,则可能是 pyinstaller 出于某种原因没有正确检测到可选依赖项的使用,并且错误地忽略了它。在这种情况下,pyinstaller's troubleshooting docs 可能是最好的起点。例如,添加hidden import 可能会解决问题。

【讨论】:

    猜你喜欢
    • 2022-12-27
    • 2023-01-16
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2019-02-09
    • 2022-12-01
    相关资源
    最近更新 更多