首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >尝试从导入包导入模块时的“ModuleNotFoundError”

尝试从导入包导入模块时的“ModuleNotFoundError”
EN

Stack Overflow用户
提问于 2019-02-08 18:29:12
回答 6查看 323.7K关注 0票数 37

这是我的目录结构:

代码语言:javascript
运行
复制
man/                          
  Mans/                  
          man1.py
  MansTest/
          SoftLib/
                  Soft/
                      SoftWork/
                              manModules.py
          Unittests/
                    man1test.py

man1.py包含以下导入语句,,我不想更改

代码语言:javascript
运行
复制
from Soft.SoftWork.manModules import *

man1test.py包含以下导入语句:

代码语言:javascript
运行
复制
from ...MansTest.SoftLib import Soft
from ...Mans import man1

我需要man1test.py中的第二个导入,因为man1test.py需要访问man1.py中的一个函数。

我的第一个导入(Soft)的基本原理是在man1.py中方便前面提到的导入语句。

然而,与我的预期相反,man1.py中的导入语句产生了以下结果:

代码语言:javascript
运行
复制
ModuleNotFoundError: No module named 'Soft'

当我跑的时候

代码语言:javascript
运行
复制
python3 -m man.MansTest.Unittests.man1test

来自man/上面的目录。

有没有办法在不向man1.py 中添加任何内容的情况下,在不更改导入语句的情况下解决此错误?

编辑:python3 -m man.ManTest.Unittests.man1test从问题的原始版本更改为python3 -m man.MansTest.Unittests.man1test

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2019-02-10 03:27:35

FIRST,如果您希望能够从man1test.py访问man1.py,从man1.py访问manModules.py,则需要正确地将文件设置为包和模块

包是使用“虚线模块名称”构造Python模块命名空间的一种方法。例如,模块名A.B在名为A的包中指定一个名为B的子模块。 ..。 导入包时,Python在sys.path上的目录中搜索包子目录。 需要__init__.py文件才能使Python将目录视为包含包;这样做是为了防止具有公共名称的目录(如string )无意中隐藏模块搜索路径后面出现的有效模块。

你需要把它设置成这样的东西:

代码语言:javascript
运行
复制
man
|- __init__.py
|- Mans
   |- __init__.py
   |- man1.py
|- MansTest
   |- __init.__.py
   |- SoftLib
      |- Soft
         |- __init__.py
         |- SoftWork
            |- __init__.py
            |- manModules.py
      |- Unittests
         |- __init__.py
         |- man1test.py

第二个,对于from ...Mans import man1在man1test.py中引起的"ModuleNotFoundError: No module named 'Soft'“错误,文档中的解决方案是将man1.py添加到sys.path中,因为Mans在MansTest包之外。请参阅Python文档中的模块搜索路径。但是,如果不想直接修改sys.path,也可以修改PYTHONPATH

从以下位置初始化sys.path

  • 包含输入脚本的目录(或未指定文件时的当前目录)。
  • PYTHONPATH (目录名列表,语法与PATH变量相同)。
  • 与安装相关的默认设置。

THIRD,对于from ...MansTest.SoftLib import Soft,您说“是为了方便前面提到的man1.py中的导入语句”,现在导入就是这样工作的。如果要在man1.py中导入Soft.SoftLib,则必须设置man1.py才能找到Soft.SoftLib并直接导入到那里。

这么说,我是怎么让它开始工作的。

man1.py:

代码语言:javascript
运行
复制
from Soft.SoftWork.manModules import *
# no change to import statement but need to add Soft to PYTHONPATH

def foo():
    print("called foo in man1.py")
    print("foo call module1 from manModules: " + module1())

man1test.py

代码语言:javascript
运行
复制
# no need for "from ...MansTest.SoftLib import Soft" to facilitate importing..
from ...Mans import man1

man1.foo()

manModules.py

代码语言:javascript
运行
复制
def module1():
    return "module1 in manModules"

终端输出:

代码语言:javascript
运行
复制
$ python3 -m man.MansTest.Unittests.man1test
Traceback (most recent call last):
  ...
    from ...Mans import man1
  File "/temp/man/Mans/man1.py", line 2, in <module>
    from Soft.SoftWork.manModules import *
ModuleNotFoundError: No module named 'Soft'

$ PYTHONPATH=$PYTHONPATH:/temp/man/MansTest/SoftLib
$ export PYTHONPATH
$ echo $PYTHONPATH
:/temp/man/MansTest/SoftLib
$ python3 -m man.MansTest.Unittests.man1test
called foo in man1.py
foo called module1 from manModules: module1 in manModules 

作为一种建议,也许可以重新考虑这些SoftLib文件的用途。它是man1.py和man1test.py之间的某种“桥梁”吗?现在设置文件的方式,我不认为它会像你期望的那样工作。此外,从测试文件夹(MansTest)下导入内容对于测试代码(man1.py)来说也有点混乱。

票数 78
EN

Stack Overflow用户

发布于 2021-12-07 19:10:34

我也有过类似的问题,虽然不一样。

我的文件夹和文件的结构(GUI_ML是主文件夹):

代码语言:javascript
运行
复制
GUI_ML
\ Views \ login.py
\ Views \ __ init __.py
\ Controllers \ Control_login.py
\ Controllers \ __ init __.py

我需要从Control_login.py中导入login.py。以下代码解决了我的问题:

代码语言:javascript
运行
复制
import sys
import os
myDir = os.getcwd()
sys.path.append(myDir)

from pathlib import Path
path = Path(myDir)
a=str(path.parent.absolute())

sys.path.append(a)

from Controllers.Control_login import Control_login
票数 6
EN

Stack Overflow用户

发布于 2020-07-03 08:51:54

对于我来说,当我创建一个文件并将它保存为python文件时,我在导入过程中得到了这个错误。我必须用".py“类型创建一个文件名,比如filename.py,然后将其保存为python文件。文章试图导入的文件为我工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54598292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档