这是我的目录结构:
man/
Mans/
man1.py
MansTest/
SoftLib/
Soft/
SoftWork/
manModules.py
Unittests/
man1test.py
man1.py
包含以下导入语句,,我不想更改
from Soft.SoftWork.manModules import *
man1test.py
包含以下导入语句:
from ...MansTest.SoftLib import Soft
from ...Mans import man1
我需要man1test.py
中的第二个导入,因为man1test.py
需要访问man1.py
中的一个函数。
我的第一个导入(Soft)的基本原理是在man1.py
中方便前面提到的导入语句。
然而,与我的预期相反,man1.py
中的导入语句产生了以下结果:
ModuleNotFoundError: No module named 'Soft'
当我跑的时候
python3 -m man.MansTest.Unittests.man1test
来自man/上面的目录。
有没有办法在不向man1.py
和中添加任何内容的情况下,在不更改导入语句的情况下解决此错误?
编辑:python3 -m man.ManTest.Unittests.man1test
从问题的原始版本更改为python3 -m man.MansTest.Unittests.man1test
发布于 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
)无意中隐藏模块搜索路径后面出现的有效模块。
你需要把它设置成这样的东西:
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:
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
# no need for "from ...MansTest.SoftLib import Soft" to facilitate importing..
from ...Mans import man1
man1.foo()
manModules.py
def module1():
return "module1 in manModules"
终端输出:
$ 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)来说也有点混乱。
发布于 2021-12-07 19:10:34
我也有过类似的问题,虽然不一样。
我的文件夹和文件的结构(GUI_ML是主文件夹):
GUI_ML
\ Views \ login.py
\ Views \ __ init __.py
\ Controllers \ Control_login.py
\ Controllers \ __ init __.py
我需要从Control_login.py中导入login.py。以下代码解决了我的问题:
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
发布于 2020-07-03 08:51:54
对于我来说,当我创建一个文件并将它保存为python文件时,我在导入过程中得到了这个错误。我必须用".py“类型创建一个文件名,比如filename.py,然后将其保存为python文件。文章试图导入的文件为我工作。
https://stackoverflow.com/questions/54598292
复制相似问题