【发布时间】:2018-11-27 15:49:26
【问题描述】:
我尝试使用 flask 和 unittest 创建简单的 Python 项目。结构很简单:
classes
|-sysinfo
|static
|templates
|- index.html
|- layout.html
|__init__.py
|sysinfo.py
|printinfo.py
tests
|test_sysinfo.py
README.md
requirments.txt
printinfo.py中的非常简单的类:
#!/usr/bin/python
import psutil
import json
class SysInfo:
.......
def displayInfo(self):
.......
return json.dumps(self.__data)
简单的烧瓶服务器使用sysinfo.py 运行:
from flask import Flask, flash, redirect, render_template, request, session, abort
from printinfo import SysInfo
import json
obj1 = SysInfo("gb")
app = Flask(__name__)
@app.route('/')
def index():
var = json.loads(obj1.displayInfo())
return render_template('index.html',**locals())
@app.route('/healthcheck')
def healthcheck():
return "Ok"
@app.route("/api/all")
def all():
return obj1.displayInfo()
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
del obj1
我用 python sysinfo.py 运行它,留在classes/sysinfo 文件夹中,一切正常。
所以我决定为我的应用程序运行 unittest。放入classes/tests(也试过classes/sysinfo/tests)文件test_sysinfo.py,代码:
import unittest
import printinfo
from sysinfo import sysinfo
import json
import sys
class TestFlaskApi(unittest.TestCase):
def setUp(self):
self.app = sysinfo.app.test_client()
def simple_test(self):
response = self.app.get('/health')
self.assertEqual(
json.loads(response.get_data().decode(sys.getdefaultencoding())),
{'healthcheck': 'ok'}
)
if __name__ == "__main__":
unittest.main()
当我启动它时,我可以看到错误:
Error Traceback (most recent call last):
File "\Python\Python37-32\lib\unittest\case.py", line 59, in testPartExecutor
yield File "\Python\Python37-32\lib\unittest\case.py", line 615, in run
testMethod() File "\Python\Python37-32\lib\unittest\loader.py", line 34, in testFailure
raise self._exception ImportError: Failed to import test module: test_sysinfo Traceback (most recent call last): File
"\Python\Python37-32\lib\unittest\loader.py", line 154, in
loadTestsFromName
module = __import__(module_name) File "\classes\sysinfo\tests\test_sysinfo.py", line 2, in <module>
import printinfo ModuleNotFoundError: No module named 'printinfo'
我阅读了几篇关于 StackOverflow 的文章和一些主题,以了解它与项目结构有关。我试图创建setup.py 和setup.cfg。我设法使用此设置启动它,但测试仍然无法正常工作。
您能帮我设置适用于我的情况的最低设置吗?我找到的所有材料都是针对特定案例或过于笼统而写的。我不能将它应用于我的案例。
【问题讨论】:
-
这是一个
sys.path问题。如果通过python classes/tests/test_sysinfo.py运行测试,classes/sysinfo目录将不会出现在sys.path中,因此 Python 无法导入printinfo模块。无需进一步修改项目结构,您可以将目录显式添加到sys.path作为解决方法:PYTHONPATH=classes/sysinfo/ python classes/tests/test_sysinfo.py。 -
但是,您的导入看起来有点混乱。
sysinfo是一个包,所以你应该通过from sysinfo import printinfo导入printinfo(因为你已经在另一个模块中这样做了:from sysinfo import sysinfo)。修复后,将classes添加到sys.path(因为它是sysinfo包的父目录)并且应该解决导入问题:PYTHONPATH=classes python classes/tests/test_sysinfo.py -
我试过了,现在它引发了另一个与代码相关的错误,模块错误丢失。谢谢@hoefling 我已经开始重构代码以将我的代码作为 setup.py 中的模块运行。阅读手册并尝试使其适应我的现实。
-
我准备放弃了(根据文档决定在
__init__.py初始化应用程序。这里是代码:def create_app(test_config=None): # create and configure the app app = Flask(__name__, instance_relative_config=True) app.config.from_mapping( SECRET_KEY='dev' ) from . import printinfo # Create printenv class instance obj1 = printinfo.SysInfo("gb")同样的错误...flask.cli.NoAppException: While importing "sysinfo", an ImportError was raised: -
您可以编辑问题,添加新的代码位和新的错误跟踪吗?
标签: python import python-unittest