这是我的目录结构:
man/
Mans/
man1.py
MansTest/
SoftLib/
Soft/
SoftWork/
manModules.py
Unittests/
man1test.py
man1.py
包含以下 import 语句,我不想更改:
from Soft.SoftWork.manModules import *
man1test.py
包含以下 import 语句:
from ...MansTest.SoftLib import Soft
from ...Mans import man1
我需要man1test.py
中的第二个 import,因为man1test.py
需要访问man1.py
中的一个函数。
第一个import(Soft)背后的基本原理是方便前面提到的man1.py
中的 import 语句。
然而,与我的预期相反,man1.py
中的 import 语句会导致:
ModuleNotFoundError: No module named 'Soft'
当我奔跑时
python3 -m man.MansTest.Unittests.man1test
从 man/ 上面的目录。
有没有什么方法可以解决这个错误而不改变man1.py
和中的 import 语句,而不向 sys.path 添加任何内容?
编辑:python3 -m man.ManTest.Unittests.man1test
从原版本的问题改为python3 -m man.MansTest.Unittests.man1test
6条答案
按热度按时间g6ll5ycj1#
首先,如果您希望能够从 man1test.py 访问 man1.py,并从 *man1.py * 访问 manModules.py,则需要将文件正确设置为包和模块。
包是一种通过使用“带点的模块名称”来构造Python的模块名称空间的方法。例如,模块名
A.B
指定名为A
的包中名为B
的子模块。...
导入包时,Python会搜索
sys.path
上的目录,查找包的子目录。__init__.py
文件是使Python将目录视为包含包所必需的;这样做是为了防止具有诸如X1 M5 N1 X的公共名称的目录无意中隐藏稍后在模块搜索路径上出现的有效模块。你需要把它设置成这样:
Second,对于 man1test.py 中的
from ...Mans import man1
导致的“ModuleNotFoundError: No module named 'Soft'
”错误,文档中的解决方案是将 man1.py 添加到sys.path
,因为 Mans 在 MansTest 包之外。参见Python文档中的模块搜索路径。但是如果你不想直接修改sys.path
,你也可以修改PYTHONPATH
:sys.path
从以下位置初始化:PYTHONPATH
(目录名列表,语法与shell变量PATH
相同)。第三个,对于
from ...MansTest.SoftLib import Soft
,您说“* 是为了方便www.example.com * 中的上述导入声明man1.py”,这就是导入的工作方式。如果你想在 man1.py 中导入 Soft.SoftLib,你必须设置 man1.py 来找到 Soft.SoftLib 并直接导入。话虽如此,下面是我如何让它工作的。
man1.py:
man1test.py
manModules.py
端子输出:
作为一个建议,也许重新考虑这些 SoftLib 文件的用途。它是 man1.py 和 man1test.py 之间的某种“桥梁”吗?你的文件现在设置的方式,我不认为它会像你期望的那样工作。此外,测试代码(man1.py)从测试文件夹(MansTest)下导入内容有点令人困惑。
2g32fytz2#
我也有类似的问题,虽然不一样。
我的文件夹和文件的结构(GUI_ML是主文件夹):
我需要从login.py导入Control_login.py。下面的代码解决了我的问题:
qxsslcnc3#
对于我来说,当我创建一个文件并将其保存为python文件时,我在导入过程中遇到了这个错误。我必须创建一个类型为“.py”的文件名,比如filename.py,然后将其保存为python文件。尝试导入文件的帖子为我工作。
z9smfwbn4#
某些包名和模块名可能相同。该冲突也以该错误来响应。
ep6jt1vc5#
我也遇到了类似的问题,我忘记在模块中放一个
__init__.py
,花了很多时间来试图理解哪里出了问题。w51jfk4q6#
另一种解决方案取决于您从何处运行此代码。
假设OP的目录结构:
如果您尝试运行
python Mans/man1.py
(从man目录),则必须执行以下两项操作才能使其正常工作:1.将www.example.com中的导入行更改man1.py为
from ManTest.SoftLib.Soft.SoftWork.manModules import *
1.如果还没有,请添加到系统环境变量。键
PYTHONPATH
,值.