Python工作流返回ModuleNotFoundError:没有模块名为'indexer'时,它曾经工作正常

qyzbxkaa  于 2023-06-28  发布在  Python
关注(0)|答案(1)|浏览(205)

我有一个Python工作流,它读取本地文件夹,将pix上传到Google Cloud进行处理,并将json文件返回到其他本地文件夹。此工作流运行正常。
我使用了这个脚本:

#!/bin/bash   
    
    # Create and activate a Python virtual environment
    python -m venv dg_ocr_env
    source dg_ocr_env/bin/activate
    
    # Deactivate any existing Conda environment
    conda deactivate
    
    # Upgrade pip
    python -m pip install --upgrade pip
    
    # Install packages from requirements.txt
    pip install -r /Users/XXXX/Desktop/ocv/00_setup_VENV_dg_ocr/requirements.txt

...然后我就可以运行我的main.py脚本而不会出错。
然后,我尝试了dockerizing并点击了这个:

ModuleNotFoundError: No module named 'indexer'

我想这可能只和Docker有关......无论是单独构建还是Docker组合,没有缓存的重建(以及我在互联网上找到的所有其他方法),我得到了以下错误或类似的东西:

docker run ocr-image              
Traceback (most recent call last):
  File "/app/unified_ocr_2_json.py", line 15, in <module>
    from spellchecker import SpellChecker
  File "/usr/local/lib/python3.9/site-packages/spellchecker/__init__.py", line 2, in <module>
    from  spellchecker.core import Spellchecker,getInstance
  File "/usr/local/lib/python3.9/site-packages/spellchecker/core.py", line 26, in <module>
    from indexer import DictionaryIndex
ModuleNotFoundError: No module named 'indexer'

我尝试的:为了弄清楚这个过程,我擦除了另一台计算机,设置了一个干净的Monterey操作系统,除了Anaconda、Brew和sublime.txt之外,什么也没安装。
然后,我尝试从我的py脚本目录等重新创建,即,很短时间前的工作流程在本地工作得很好:
我运行了我的.sh(如上所示):...现在这里是最新的追踪从干净的计算机:

python /Users/aiki/Desktop/ocv/unified_ocr_2_json.py 
Traceback (most recent call last):
  File "/Users/aiki/Desktop/ocv/unified_ocr_2_json.py", line 11, in <module>
    from spellchecker import SpellChecker
  File "/Users/aiki/opt/anaconda3/lib/python3.9/site-packages/spellchecker/__init__.py", line 2, in <module>
    from  spellchecker.core import Spellchecker,getInstance
  File "/Users/aiki/opt/anaconda3/lib/python3.9/site-packages/spellchecker/core.py", line 26, in <module>
    from indexer import DictionaryIndex
ModuleNotFoundError: No module named 'indexer'

我的script.py调用:

from spellchecker import SpellChecker

下面是pip show spellchecker:

(dg_ocr_env) aware@awares-MacBook-Pro spellchecker % ls
__init__.py core.py     indexer.py  langdetect.py   resources   templates
__pycache__ dicts       info.py     py.typed    spellchecker.py utils.py
(dg_ocr_env) aware@awares-MacBook-Pro spellchecker %

和nano core.py:

#
import os
import string
import codecs
import inexactsearch
import urllib

from indexer import DictionaryIndex
from langdetect import _detect_lang

__all__ = ['Spellchecker', 'getInstance']

我看过www.example.com里面core.py(索引器在那里...),我检查了依赖冲突,我检查了requirements.txt和拼写检查器说它需要列出,等等这么多-
我不知道是什么改变了我只知道过去在本地一台计算机上工作的东西,现在不再在本地任何一台计算机上工作,更不用说在任何类型的Docker容器中了。
任何帮助都将不胜感激,谢谢!

xxslljrj

xxslljrj1#

我找到了答案--约翰上面的评论让我再次走上了这条特别的道路……发现的关键点是:
你可能会认为pyspellchecker模块需要一个import语句,内容如下:

from pyspellchecker import SpellChecker

但事实并非如此正确的版本是:

from spellchecker import SpellChecker

但这和模块的名字不匹配,对吧?此外,还有一个叫做拼写检查器的模块。一旦我卸载了这两个,并重新安装到我的conda venv只有pyspellchecker,事情再次工作。
但以下是导致最终发现的事情,希望对其他人在解决此类错误时有用:
1 -我开始打印我认为可能存在冲突的软件包列表:

conda list
pip list

这并没有真正的帮助,所以我发现我可以:
2 -验证正确的Python可执行文件:在我的.py脚本中,我添加了print(sys.executable)来打印Python可执行文件的位置。它(应该)指向myenv环境中的Python可执行文件。
3 -然后我了解到,我可以通过直接在终端中运行Python会话来更好地进行故障排除。但首先要说清楚:

Deactivate the current environment:
conda deactivate

Reactivate myenv environment:
    
conda activate myenv

4 -通过键入python并按enter开始新的Python交互会话。

python 
>>>

I checked:
    

>>>import sys
>>>print(sys.executable)
>>>print(sys.version)

Python解释器路径(来自sys.executable)应该指向myenv环境中的Python解释器,并且Python版本(来自sys.version)应该是我期望用于此环境的版本。
5 -一旦我知道了路径,并且仍然在同一个python会话中直接进入终端:

>>>import site
>>>print(site.getsitepackages())

这将打印Python用于查找site-packages(第三方库)的目录列表。
6 -退出Python,exit()并列出myenv环境的site-packages目录的内容:


ls /Users/XXXX/opt/anaconda3/envs/myenv/lib/python3.8/site-packages

这列出了myenv中安装的所有软件包。我检查了pyspellchecker是否在这个列表中。是的。还有别的事...
还有一个拼写检查目录列在那里。
7 -所以我尝试使用拼写检查器名称导入。再次运行python终端会话,然后:

>>>import spellchecker
>>>print(spellchecker.__file__)

如果导入成功,则会打印导入的模块的路径。我将能够看到它是否对应于pyspellchecker或其他东西,但它失败了,这意味着这些是冲突的,对吗?
当我导入spellchecker时,Python找到的模块与pyspellchecker不同,这就是为什么当我尝试导入pyspellchecker时会出现冲突。
8 -所以也许最好的做法是卸载这两个软件包,然后只重新安装pyspellchecker。
9 -记住在完成测试时通过键入exit()或按Ctrl+D退出Python解释器。然后:

pip uninstall pyspellchecker spellchecker
pip install pyspellchecker

在此之后,一切都很顺利。
感谢所有在这条路上帮助我的人!

相关问题