首页 > 解决方案 > 从子子文件夹导入模块的问题

问题描述

我正在尝试使用不确定性库,并且在我的 dir 结构中克隆了 repo,如下所示:

.Lux/
├── generateFeatures.py
├── generateLexicons.py
├── __init__.py
├── res
│   ├── __init__.py
│   ├── test2.py
│   └── uncertainty
│       ├── __init__.py
│       ├── test1.py
│       └── uncertainty
│           ├── classifier.py
│           ├── lib
│           │   ├── __init.py__
│           │   └── nlp
│           │       ├── __init__.py

我的两个 test.py 有相似的内容,他们所做的只是导入不确定性分类器

test1.py 完美运行

from uncertainty.classifier import Classifier

但是 test2.py

from uncertainty.uncertainty.classifier import Classifier

产量:

Traceback (most recent call last):
  File "/home/lucas/Lux/Lux/lib/python3.5/site-packages/pkg_resources/__init__.py", line 359, in get_provider
    module = sys.modules[moduleOrReq]
KeyError: 'uncertainty.lib.nlp'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    from uncertainty.uncertainty.classifier import Classifier
  File "/home/lucas/Lux/res/uncertainty/uncertainty/classifier.py", line 9, in <module>
    from .lib.nlp import summarizer
  File "/home/lucas/Lux/res/uncertainty/uncertainty/lib/nlp/__init__.py", line 3, in <module>
    VERBS_PATH = resource_filename('uncertainty.lib.nlp', 'verbs.txt')
  File "/home/lucas/Lux/Lux/lib/python3.5/site-packages/pkg_resources/__init__.py", line 1144, in resource_filename
    return get_provider(package_or_requirement).get_resource_filename(
  File "/home/lucas/Lux/Lux/lib/python3.5/site-packages/pkg_resources/__init__.py", line 361, in get_provider
    __import__(moduleOrReq)
ImportError: No module named 'uncertainty.lib'

为什么 test1.py 有效而 test2.py 无效?

更新

__init__.py在每个没有它们的文件夹上都放了空,但仍然无法弄清楚。

我尝试将我的外部uncertainty文件夹重命名为其他名称,认为这可能是一个错误的解析名称,但这也不起作用。

标签: pythonpython-3.x

解决方案


问题是由于__init__.py文件lib/nlp夹中的文件而发生的。正如thom747在评论中指出的那样,为inVERBS_PATH提供了一条路径。verbs'txtuncertainty/lib/nlp

当您从 导入时,此路径是正确的test1.py,但在从 导入时test2.py,它会在文件所在lib/nlp的父uncertainty目录中test2.py查找。它找不到一个,因此你得到一个ImportError.

使固定

只需将文件中VERBS_PATH的分配更改为uncertainty/lib/nlp/__init__.py

VERBS_PATH = resource_filename('uncertainty.uncertainty.lib.nlp', 'verbs.txt')

推荐阅读