Python嵌套子包不';运行测试时不导入

Python嵌套子包不';运行测试时不导入,python,pytest,Python,Pytest,我的文件夹结构如下: api -- test -- test_api.py -- __init__.py -- api -- api.py -- __init__.py -- sub -- sub.py -- __init__.py sub.py: Base = 'base' from sub.sub import Base from api.api import stuff_to_test def test_stu

我的文件夹结构如下:

api
-- test
    -- test_api.py
    -- __init__.py
-- api
    -- api.py
    -- __init__.py
    -- sub
        -- sub.py
        -- __init__.py
sub.py

Base = 'base'
from sub.sub import Base
from api.api import stuff_to_test

def test_stuff_to_test():
    stuff_to_test()
>>> from tests.test_api import *
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/<somepath>/api/tests/test_api.py", line 1, in <module>
    from api.api import stuff_to_test
  File "/<somepath>/api/api/__init__.py", line 1, in <module>
    from . import api
  File "/<somepath>/api/api/api.py", line 1, in <module>
    from sub.sub import Base
ImportError: No module named 'sub'
api.py

Base = 'base'
from sub.sub import Base
from api.api import stuff_to_test

def test_stuff_to_test():
    stuff_to_test()
>>> from tests.test_api import *
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/<somepath>/api/tests/test_api.py", line 1, in <module>
    from api.api import stuff_to_test
  File "/<somepath>/api/api/__init__.py", line 1, in <module>
    from . import api
  File "/<somepath>/api/api/api.py", line 1, in <module>
    from sub.sub import Base
ImportError: No module named 'sub'
def stuff_to_test(): 通过

测试api.py

Base = 'base'
from sub.sub import Base
from api.api import stuff_to_test

def test_stuff_to_test():
    stuff_to_test()
>>> from tests.test_api import *
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/<somepath>/api/tests/test_api.py", line 1, in <module>
    from api.api import stuff_to_test
  File "/<somepath>/api/api/__init__.py", line 1, in <module>
    from . import api
  File "/<somepath>/api/api/api.py", line 1, in <module>
    from sub.sub import Base
ImportError: No module named 'sub'
我在目录
api
中。 我运行
pytest

==================================== ERRORS ====================================
______________________ ERROR collecting tests/test_api.py ______________________
ImportError while importing test module '/<somepath>/api/tests/test_api.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_api.py:1: in <module>
    from ..api.api import stuff_to_test
api/__init__.py:1: in <module>
    from . import api
api/api.py:1: in <module>
    from sub.sub import Base
E   ImportError: No module named 'sub'
!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!
=========================== 1 error in 0.08 seconds ============================
我的第一个想法是在
api.py
relative中进行导入:

from .sub.sub import Base
这样测试运行良好。 但是如果我运行
pythonapi/api.py
我会得到以下错误:

Traceback (most recent call last):
  File "api/api.py", line 1, in <module>
    from .sub.sub import Base
SystemError: Parent module '' not loaded, cannot perform relative import
回溯(最近一次呼叫最后一次):
文件“api/api.py”,第1行,在
从.sub.sub导入基础
SystemError:未加载父模块“”,无法执行相对导入

我怎样才能让它运行测试和应用程序呢?

我通过在
测试中添加以下内容来解决这个问题

project_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
api_path= os.path.join(project_path, 'api')
sys.path.append(api_path)

在python中,有两种导入模块的方法,一种是相对路径,另一种是绝对路径。 当您从sub.sub导入库写入
时,您正在执行绝对路径导入,对于相对路径导入,请从.sub.sub导入库写入

绝对路径导入可以在PYTHONPATH中查找导入的起点,因此您应该从api.sub.sub import Base编写


有关更多信息:

对于子模块,我建议在api.py中使用
from.sub.sub导入库
,或者至少使用api.sub.sub导入库
中的绝对
,这无法回答问题,抱歉