鍍金池/ 問(wèn)答/Python/ pytest無(wú)法引入上一層的模塊

pytest無(wú)法引入上一層的模塊

目錄結(jié)構(gòu)

├── 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

然后執(zhí)行py.test -s ./tests/ 發(fā)生

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

有點(diǎn)蒙蔽看aiomysql怎么都沒(méi)問(wèn)題

源碼在

源碼

回答
編輯回答
只愛你

python里面import是有路徑的,你可以查下相關(guān)資料,這里我簡(jiǎn)單說(shuō)明下其中的一種:

當(dāng)我有/home/a/main.py和/home/b/utils.py文件時(shí),此時(shí)我使用python /home/a/main.py運(yùn)行該文件時(shí),python會(huì)自動(dòng)將/home/a/目錄加到import的搜索路徑里面,如果/home/a/main.py文件里面需要引用/home/b/utils.py里面的文件直接使用from b import utils是不行的,因?yàn)?home/b/沒(méi)有在python的import路徑里面。

解決辦法有幾種:
1,使用sys.path.append('你的包路徑,對(duì)應(yīng)你的項(xiàng)目應(yīng)該是aiosqlite3的父級(jí),假如說(shuō)aiosqlite3目錄是在/home/dir/目錄下,那這里就是/home/dir');
2,使用相對(duì)路徑引用;

2018年4月13日 02:58
編輯回答
薔薇花

現(xiàn)在的方案是在
test/conftest.py 導(dǎo)入其它模塊前

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

不知道為什么 pytest 只把項(xiàng)目下的 tests 文件夾加入了 sys.path,而項(xiàng)目文件夾沒(méi)有加入。

2018-05-02:

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

然后 pytest 只能以 tests__main__

2017年11月27日 03:54
編輯回答
別硬撐

首先要看你的setup.py的包名的設(shè)置,
然后要運(yùn)行python setup.py install,
或者直接把導(dǎo)入代碼換成

import ..aiosqlite

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

2017年6月7日 21:06