python-3.x Streamlit +空格导致“属性错误:“PathDistribution”对象没有属性“_normalized_name”“

nzkunb0c  于 2023-01-18  发布在  Python
关注(0)|答案(1)|浏览(213)

**注意:**这不是一个重复的问题,因为我已经通过了this answer,并进行了必要的软件包降级,但它仍然导致相同的错误。详细信息如下。

#系统详细信息

  • 苹果笔记本电脑(M1)
  • MacOS Monterey 12.3
  • Python 3.10.8(迷你图标环境)
  • pip freeze中的相关库版本
importlib-metadata==3.4.0
PyMuPDF==1.21.1
spacy==3.4.4
spacy-alignments==0.9.0
spacy-legacy==3.0.11
spacy-loggers==1.0.4
spacy-transformers==1.2.0
streamlit==1.17.0
flair==0.11.3
catalogue==2.0.8

#设置

  • 我正在尝试使用Spacy对上传到Streamlit应用程序的pdf文档进行一些文本处理。
  • Streamlit应用程序基本上包含一个上传按钮、提交按钮(调用预处理和spacy函数)和一个text_area来显示处理后的文本。

下面是上传pdf文档并提取其文本的工作代码-

import streamlit as st
import fitz

def load_file(file):
    doc = fitz.open(stream=uploaded_file.read(), filetype="pdf")    
    text = []
    with doc:
        for page in doc:
            text.append(page.get_text())
        text = "\n".join(text)
    return text

#####################################################################   

st.title("Test app")

col1, col2 = st.columns([1,1], gap='small')

with col1:
    with st.expander("Description -", expanded=True):
        st.write("This is the description of the app.")
    
with col2:
    with st.form(key="my_form"):
        uploaded_file = st.file_uploader("Upload",type='pdf', accept_multiple_files=False, label_visibility="collapsed")
        submit_button = st.form_submit_button(label="Process")        

#####################################################################        
        
col1, col2 = st.columns([1,3], gap='small')

with col1:
    st.header("Metrics")

with col2:
    st.header("Text")
    
    if uploaded_file is not None:
        text = load_file(uploaded_file)
        st.text_area(text)

#重现基本代码

  • 安装必要的库
  • 保存上述代码到一个test.py文件
  • 从终端导航到文件夹并运行streamlit run test.py
  • 在浏览器中导航到http://localhost:8501/
  • 下载this sample pdf并将其上传到应用程序作为示例

结果是一个正常运行的应用程序-

#我面临的问题

现在,当我使用import spacyspacy添加到python文件中并重新运行streamlit应用程序时,问题出现了-

AttributeError: 'PathDistribution' object has no attribute '_normalized_name'
Traceback:
File "/Users/akshay_sehgal/miniconda3/envs/demo_ui/lib/python3.10/site-packages/streamlit/runtime/scriptrunner/script_runner.py", line 565, in _run_script
    exec(code, module.__dict__)
File "/Users/akshay_sehgal/Library/CloudStorage/________/Documents/Code/Demo UI/Streamlit/keyphrase_extraction_template/test.py", line 3, in <module>
    import spacy
File "/Users/akshay_sehgal/miniconda3/envs/demo_ui/lib/python3.10/site-packages/spacy/__init__.py", line 6, in <module>
    from .errors import setup_default_warnings
File "/Users/akshay_sehgal/miniconda3/envs/demo_ui/lib/python3.10/site-packages/spacy/errors.py", line 2, in <module>
    from .compat import Literal
File "/Users/akshay_sehgal/miniconda3/envs/demo_ui/lib/python3.10/site-packages/spacy/compat.py", line 3, in <module>
    from thinc.util import copy_array
File "/Users/akshay_sehgal/miniconda3/envs/demo_ui/lib/python3.10/site-packages/thinc/__init__.py", line 5, in <module>
    from .config import registry
File "/Users/akshay_sehgal/miniconda3/envs/demo_ui/lib/python3.10/site-packages/thinc/config.py", line 1, in <module>
    import catalogue
File "/Users/akshay_sehgal/miniconda3/envs/demo_ui/lib/python3.10/site-packages/catalogue/__init__.py", line 20, in <module>
    AVAILABLE_ENTRY_POINTS = importlib_metadata.entry_points()  # type: ignore
File "/Users/akshay_sehgal/miniconda3/envs/demo_ui/lib/python3.10/importlib/metadata/__init__.py", line 1009, in entry_points
    return SelectableGroups.load(eps).select(**params)
File "/Users/akshay_sehgal/miniconda3/envs/demo_ui/lib/python3.10/importlib/metadata/__init__.py", line 459, in load
    ordered = sorted(eps, key=by_group)
File "/Users/akshay_sehgal/miniconda3/envs/demo_ui/lib/python3.10/importlib/metadata/__init__.py", line 1006, in <genexpr>
    eps = itertools.chain.from_iterable(
File "/Users/akshay_sehgal/miniconda3/envs/demo_ui/lib/python3.10/importlib/metadata/_itertools.py", line 16, in unique_everseen
    k = key(element)

#我尝试了什么?

1.我尝试的第一件事是隔离spacy代码,并在特定环境下的笔记本中运行它,它工作起来没有任何问题。
1.接下来,在研究了SO(this answer)和github问题之后,我发现importlib.metadata可能是潜在的罪魁祸首,因此我使用以下代码对此进行了降级,但它没有修复任何问题。

pip uninstall importlib-metadata
pip install importlib-metadata==3.4.0

1.我删除了整个环境,并从头开始重新设置整个环境,遵循我第一次使用的相同步骤(以防我在设置过程中犯了一些错误),但仍然是同样的错误。
1.最后一个选项是将空间处理容器化为API,然后使用requests通过streamlit应用程序调用它
如果需要的话,我很乐意分享requirements.txt,但我必须想出如何通过我的办公室电脑将其上传到某个地方。如果需要,请让我知道,我会找到方法的。
将感谢任何帮助解决这个问题!

9udxz4iz

9udxz4iz1#

importlib-metadata升级到importlib-metadata>=4.3.0以避免此特定错误。
内置的importlib.metadata和附加的importlib_metadata包之间可能存在复杂的交互,您需要更新版本的importlib-metadata来获得与此相关的一些更新/修复。
在python 3.10和importlib-metadata==3.4.0中,您可以在以下示例中看到此错误(spacystreamlit不是必需的):

import importlib_metadata
import importlib.metadata
importlib.metadata.entry_points()

相关问题