我正在尝试通过《Python程序员之旅》中描述的方法构建项目。我在测试结构方面遇到了问题。
我的文件结构如下:
.
├── __init__.py
├── sample
│ ├── __init__.py
│ └── core.py
├── setup.py
└── tests
├── __init__.py
├── context.py
└── test_core.py
使用:
# sample/core.py
class SampleClass:
def got_it(self):
return True
并且:
# tests/context.py
import os
import sys
sys.path.insert(0, os.path.abspath(
os.path.join(os.path.dirname(__file__), '..')
))
import sample
并且:
# tests/test_core.py
import unittest
from .context import sample
class SampleClassTest(unittest.TestCase):
def test_got_it(self):
# ...
pass
if __name__ == '__main__':
unittest.main()
(请注意,我只是在根目录和测试中添加了__init__.py文件来查看是否有所帮助,但事实并非如此。)
当我尝试使用Python 3.7运行tests/test_core.py时,出现以下错误:
ImportError: attempted relative import with no known parent package
如果我从测试目录外部或内部运行测试文件会发生什么。
如果我删除.
并在tests/test_core.py中这样做:
from context import sample
所有内容都已经加载,但是我无法访问SampleClass
。
我尝试过的方法有:
sc = SampleClass()
NameError: name 'SampleClass' is not defined
sc = sample.SampleClass()
AttributeError: module 'sample' has no attribute 'SampleClass'
sc = sample.core.SampleClass()
AttributeError: module 'sample' has no attribute 'core'
sc = core.SampleClass()
NameError: name 'core' is not defined
我也尝试使用Python 2版本,但出现了类似的问题(稍有不同的错误方法)。同时,我还尝试将函数调用代替类调用,但同样遇到了问题。
请问有人能指引我错在哪里吗?
sys.path.insert
hack很奇怪,而且在运行测试之前应该安装您的软件包(创建和激活虚拟环境,然后执行pip install --editable .
或python ./setup.py develop
),并使测试直接导入内容。 - Czaporka