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导入myapplibmyapp.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:没有模块命名的主要内容,如果未能解决你的问题,请参考以下文章

ImportError:没有名为包的模块

升级到 Django 1.7。导入错误:没有名为仪表板的模块

ImportError:没有名为 pydot 的模块(无法导入 pydot)

从脚本导入已安装的包会引发“AttributeError:模块没有属性”或“ImportError:无法导入名称”

ImportError:导入 dj_database_url ImportError:没有名为“dj_database_url”的模块

ImportError:无法导入设置(是不是在 sys.path 上?设置文件中是不是存在导入错误?):没有名为 setting 的模块