pytest模块导入ImportError:没有模块命名
Posted
技术标签:
【中文标题】pytest模块导入ImportError:没有模块命名【英文标题】:pytest module import ImportError: No module named 【发布时间】:2018-07-19 13:36:59 【问题描述】:这个问题已经被问过 DOZENS 次了,但是我遇到的每一个问题都没有适合我的解决方案。
我正在使用 Python 2.7 和 pytest
运行测试。
结构如下(来自我的项目/git repo的根目录):
myapp/
myapp/
__init__.py # def main():
# ... stuff
# if __name__ == "__main__":
# main()
__main__.py # import __init__ as myapp
# myapp.main()
config.yaml # (app config file)
myapplib/
__init__.py # (Empty file)
config.py # Loads projectroot/config.yaml
# def cfg():
# ... stuff
tests/
test_stuff.py # from myapplib.config import cfg
然后我尝试运行 tests/test_stuff.py 文件:
cd projectroot
pytest
它抱怨:
myapp/tests/test_stuff.py:38: in <module>
from myapplib.config import cfg
E ImportError: No module named myapp.config
我尝试过的一些事情:
-
使用
-m
导入myapplib
或myapp.myapplib
从不同的目录开始 pytest
(例如,在 tests/ 内部)
在所有其他答案中使用所有路径技巧
将其更改为 from . import XXX
或 ..
或任何相关导入选项(但这些都因ValueError: Attempted relative import in non-package
而失败。
应用程序本身在项目目录中运行良好,毫无价值:
cd projectroot
python myapp
...所有配置和路径都可以正常工作。只是测试找不到路径。
这是我目前所拥有的完整复制品:
https://pyfiddle.io/fiddle/4fa60f5a-02df-43bb-8aa3-03e59ff72650/?m=Saved%20fiddle
【问题讨论】:
看来myapp.config
不存在。不应该是myapp.myapplib.config
吗?该错误似乎与您的代码不匹配。
是的,也试过了,只是抱怨ImportError: No module named myapp.myapplib.config
是的,也试过了????
我的意思是你说你的代码是from myapplib.config import cfg
,但错误状态是from myapp.config import cfg
。先澄清一下
哈,哎呀红鲱鱼。更新了问题。
【参考方案1】:
你在跑步
myapp/tests/test_stuff.py
您需要编辑test_stuff.py
中的路径以指向myapp
(其中包含__init__.py
)
我在我的系统上测试了这个(文件test_stuff.py
):
import sys,os
sys.path.append(os.path.join(os.path.dirname(__file__),os.pardir,"myapp"))
import myapplib
(获取python模块的完整路径,然后使用父目录将python路径添加到myapp
的第二级)
适用于像你一样配置的脏树:
S:\python\myapp\myapp
S:\python\myapp\tests
S:\python\myapp\myapp\myapplib
S:\python\myapp\myapp\myapplib\__init__.py
S:\python\myapp\tests\test_stuff.py
建议:在摆弄sys.path.append()
时:
__file__
确保当前目录不会妨碍您。 从不依赖于当前目录,否则这个技巧只会在给定目录中起作用。
调试:打印您要添加的路径以检查它是否正确。既然是绝对的,你会很容易看出它是否正确。
【讨论】:
好吧,我一定是做错了什么。我将 path.append() 添加到/myapp/__init__.py
,但仍然没有骰子。为了安全起见,我创建了一个全新的项目,但仍然一无所获。对于它的价值,从那个路径字符串我得到myapp/../myapp
。
这是一个完整复制我的测试项目的小提琴:pyfiddle.io/fiddle/4fa60f5a-02df-43bb-8aa3-03e59ff72650/…
@brandonscript 似乎这里有一个混乱。我提到的 sn-p 必须在 test_stuff.py
中。你把我的代码放在 myapp init 中......顺便说一句,小提琴并不关心你的三引号文件名。它只是忽略它们,使用“main.py”。
哦,我明白了,你的回答应该就像我应该把它放在 init.py 中一样。这没有多大意义,是吗;)。是的 - 小提琴只是我试图将它全部保存在一个地方而不是单独的文件。
更改sys.path
仅适用于导入模块的那个。我已经编辑了我的帖子以消除混乱以上是关于pytest模块导入ImportError:没有模块命名的主要内容,如果未能解决你的问题,请参考以下文章
升级到 Django 1.7。导入错误:没有名为仪表板的模块
ImportError:没有名为 pydot 的模块(无法导入 pydot)
从脚本导入已安装的包会引发“AttributeError:模块没有属性”或“ImportError:无法导入名称”
ImportError:导入 dj_database_url ImportError:没有名为“dj_database_url”的模块
ImportError:无法导入设置(是不是在 sys.path 上?设置文件中是不是存在导入错误?):没有名为 setting 的模块