FIRST,如果你想从男人测试.py访问man1.py,从man1.py访问载人模块.py,你需要正确地将你的文件设置为packages and modules.
包是通过使用
...
导入包时,Python会在
这__init__.py
个文件是Python处理
您需要将其设置为以下内容:
man
|- __init__.py
|- Mans
|- __init__.py
|- man1.py
|- MansTest
|- __init.__.py
|- SoftLib
|- Soft
|- __init__.py
|- SoftWork
|- __init__.py
|- 载人模块.py
|- Unittests
|- __init__.py
|- 男人测试.py
SECOND,对于男人测试.py中的from ...Mans import man1
导致的"ModuleNotFoundError: No module named 'Soft'
"错误,记录在案的解决方案是将man1.py添加到sys.path
,因为Mans在MansTest包之外.请参阅Python文档中的The Module Search Path.但如果不想直接修改sys.path
,也可以修改PYTHONPATH
:
sys.path
从以下位置初始化:
- 包含输入脚本的目录(或未指定文件时的当前目录).
PYTHONPATH
(目录名列表,语法与shell变量PATH
相同).
- 依赖于安装的默认设置.
THIRD,对于from ...MansTest.SoftLib import Soft
,你说的是"was to facilitate the aforementioned import statement in man1.py",这就是进口的工作原理.如果你想在man1.py中导入Soft.SoftLib,你必须设置man1.py来找到Soft.SoftLib并直接导入.
话虽如此,我还是这么做的.
男1.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())
男人测试.py
# no need for "from ...MansTest.SoftLib import Soft" to facilitate importing..
from ...Mans import man1
man1.foo()
载人模块.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
As a suggestion, maybe re-think the purpose of those SoftLib files. Is it some sort of "bridge" between man1.py and 男人测试.py? The way your files are setup right now, I don't think it's going to work as you expect it to be. Also, it's a bit confusing for the code-under-test (man1.py) to be importing stuff from under the test folder (MansTest).