代码之家  ›  专栏  ›  技术社区  ›  brandonscript

pytest模块导入错误:没有名为的模块

  •  4
  • brandonscript  · 技术社区  · 6 年前

    有人问过这个问题 几十个 很多次了,但我遇到的每一个人都没有适合我的有效解决方案。

    我正在使用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\u之类的东西。通过执行以下操作复制文件:

    cd {projectroot}
    pytest
    

    它抱怨道:

    myapp/tests/test_stuff.py:38: in <module>
        from myapplib.config import cfg
    E   ImportError: No module named myapp.config
    

    我尝试过的一些事情:

    1. 使用 -m 要导入 myapplib myapp.myapplib
    2. 启动 pytest公司 来自不同的目录(例如内部测试/)
    3. 在所有其他答案中使用所有路径黑客
    4. 将其更改为 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

    1 回复  |  直到 6 年前
        1
  •  2
  •   brandonscript    6 年前

    你在跑步

    myapp/tests/test_stuff.py
    

    您需要在中编辑路径 test_stuff.py 指向 myapp (其中包含 __init__.py )

    我在我的系统(文件 测试内容。py公司 ):

    import sys,os
    sys.path.append(os.path.join(os.path.dirname(__file__),os.pardir,"myapp"))
    import myapplib
    

    (获取python模块的完整路径,然后使用父目录将python路径添加到 myapp )

    在我的dirtree上工作,配置与您的类似:

    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__ 以确保当前目录不会妨碍。 从不 依赖于当前目录,否则此技巧仅在给定目录中有效。
    • 调试:打印要添加的路径以检查它是否正确。因为它是绝对的,所以您很容易就能看到它是否正确。