我有以下目录树:
project/
A/
__init__.py
foo.py
TestA/
__init__.py
testFoo.py
testFoo的内容是:
import unittest
from A import foo
从project
目录运行python testA/testFoo.py
我得到一个ModuleNotFoundError No module named A
我有两个问题:如何从TestA.testFoo导入并运行A.foo,为什么在Python中掌握导入逻辑如此困难?没有任何调试技巧可以快速解决此类问题,对不起,我不得不打扰您这些基本问题?
答案 0 :(得分:1)
首先将文件夹project/testA
添加到系统pythonpath:
import sys
sys.path.insert(0, "/path/to/pythonfile")
然后再次尝试导入。
答案 1 :(得分:1)
在执行文件时,将生成一个称为python路径的环境变量,python导入将使用此变量来查找要导入的文件,该路径将与正在执行的文件的路径一起生成,并且它将在当前目录和包含__init__.py
文件的子目录,如果要从同一级别的目录导入,则需要修改python路径或更改项目的体系结构,以使执行的文件始终位于顶层。
您可以像这样包含python路径的路径:
import sys
sys.path.insert(0, "/path/to/file.py")
您可以阅读有关导入系统的更多信息:https://docs.python.org/3/reference/import.html
我认为最好的方法是不要触摸python路径,而将测试目录包含到测试文件所在的目录中:
project/
A/
__init__.py
foo.py
TestA/
__init__.py
testFoo.py
然后在您的A或项目目录中运行python -m unittest
命令,它将搜索当前目录和子目录以进行测试并执行。
更多有关单元测试的信息:https://docs.python.org/3/library/unittest.html
答案 2 :(得分:1)
你可以试试吗?
在子目录__init__.py
中创建一个空文件TestA
。并在主代码的开头添加
from __future__ import absolute_import
然后按如下所示导入:
import A.foo as testfoo
答案 3 :(得分:0)
py3中推荐的方式可能如下所示
.your-div{
background-image:url('your-image.png');
background-repeat:no-repeat;
background-size:cover;
background-position:center-center;
margin-top:-25px;
}
Python中执行模块echo $pwd
$ /home/user/project
python -m testA.testFoo
的方式是替换相对引用的好方法。
答案 4 :(得分:0)
您肯定找不到A,因为python需要从sys.path
,PYTHONPATH
中查找模块。
Python将自动将当前的top level script
添加到sys.path
而不是currently directory
添加到sys.path
。因此,如果您在print(sys.path)
中添加testFoo.py
,则只会看到将project/TestA
添加到sys.path
中。
换句话说,project
中没有包含sys.path
,那么python如何找到模块A
?
因此,您必须自己将project
文件夹添加到sys.path
中,而top script
才需要这样做,如下所示:
import unittest
import sys
import os
file_path = os.path.abspath(os.path.dirname(__file__)).replace('\\', '/')
lib_path = os.path.abspath(os.path.join(file_path, '..')).replace('\\', '/')
sys.path.append(lib_path)