![](/img/trans.png)
[英]import another subpackage from a subpackage doesn't show docstirng in Pycharm
[英]Python nested subpackage doesn't import when running tests
我有一个这样的文件夹结构:
api
-- test
-- test_api.py
-- __init__.py
-- api
-- api.py
-- __init__.py
-- sub
-- sub.py
-- __init__.py
sub.py
:
Base = 'base'
api.py
:
from sub.sub import Base
def stuff_to_test(): 通过
test_api.py
:
from api.api import stuff_to_test
def test_stuff_to_test():
stuff_to_test()
我在目录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 ============================
如果我运行python
解释器并从test_api.py
导入内容, test_api.py
发生同样的情况:
>>> 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
的导入相对:
from .sub.sub import Base
这样测试运行良好。 但是如果我运行python api/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
我怎样才能让它运行测试和应用程序运行?
我通过将以下内容添加到test.__init__.py
来解决它
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中有两种导入模块的方法,使用相对路径或使用绝对路径。 当您from sub.sub import Base
写入时from sub.sub import Base
您正在执行绝对路径导入,对于相对路径 import from .sub.sub import Base
写入。
绝对路径导入在 PYTHONPATH 中查找以找到导入的起点,因此您应该编写from api.sub.sub import Base
。
有关更多信息: Python 模块的绝对与显式相对导入
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.