pytest无法引入上一层的模块

目录结构

├── aiosqlite3
│   ├── connection.py
│   ├── cursor.py
│   ├── __init__.py
│   ├── log.py
│   ├── pool.py
│   └── utils.py
├── LICENSE
├── makefile
├── Pipfile
├── Pipfile.lock
├── README.md
├── setup.py
└── tests
    ├── conftest.py
    └── test_connect.py

conftest.py 里引入了上一层的

import aiosqlite3

然后执行py.test -s ./tests/ 发生

ModuleNotFoundError: No module named 'aiosqlite3'
ERROR: could not load ${HOME}/project/aiosqlite3/tests/conftest.py

有点蒙蔽看aiomysql怎么都没问题

源码在

源码

阅读 7.4k
3 个回答

现在的方案是在
test/conftest.py 导入其它模块前

import sys, os
sys.path.append((os.path.abspath(os.path.join(os.path.dirname(__file__), '../'))))

不知道为什么 pytest 只把项目下的 tests 文件夹加入了 sys.path,而项目文件夹没有加入。

2018-05-02:

找到原因了,是 tests 目录下的 __init__.py 写成了 __init_.py

然后 pytest 只能以 tests__main__

首先要看你的setup.py的包名的设置,
然后要运行python setup.py install,
或者直接把导入代码换成

import ..aiosqlite

或许可以直接python setup.py test,但我不是很确定。

python里面import是有路径的,你可以查下相关资料,这里我简单说明下其中的一种:

当我有/home/a/main.py和/home/b/utils.py文件时,此时我使用python /home/a/main.py运行该文件时,python会自动将/home/a/目录加到import的搜索路径里面,如果/home/a/main.py文件里面需要引用/home/b/utils.py里面的文件直接使用from b import utils是不行的,因为/home/b/没有在python的import路径里面。

解决办法有几种:
1,使用sys.path.append('你的包路径,对应你的项目应该是aiosqlite3的父级,假如说aiosqlite3目录是在/home/dir/目录下,那这里就是/home/dir');
2,使用相对路径引用;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题