【发布时间】:2014-01-25 22:25:09
【问题描述】:
我有这样的文件夹结构
App
--App
--app.py
--Docs
--Tests
--test_app.py
在我的test_app.py file 中,我有一行来导入我的应用程序模块。当我在根文件夹上运行 py.test 时,我收到关于没有名为 app 的模块的错误。我应该如何配置?
【问题讨论】:
我有这样的文件夹结构
App
--App
--app.py
--Docs
--Tests
--test_app.py
在我的test_app.py file 中,我有一行来导入我的应用程序模块。当我在根文件夹上运行 py.test 时,我收到关于没有名为 app 的模块的错误。我应该如何配置?
【问题讨论】:
这对我有用:
转到父应用,然后pip install -e .(安装本地和可编辑的应用)。
【讨论】:
使用python -m pytest 命令运行pytest 有助于解决这个问题。
由于您当前的包尚未在您的 $PYTHONPATH 或 sys.path 中 - pytest 收到此错误。
通过使用python -m pytest,您会自动将工作目录添加到sys.path 以运行pytest。他们的文档还提到:
这几乎等同于调用命令行脚本
pytest
【讨论】:
在为我的应用程序运行测试用例时,我也遇到了同样的错误
myproject
--app1
--__init.py__
--test.py
--app2
--__init.py__
--test.py
--__init.py__
我删除了我的 myproject 的 init.py 文件来运行我的测试用例。
【讨论】:
我遇到了类似的问题。在尝试了多种方法(包括在虚拟环境中安装 pytest 以及从包中添加/删除 __init__.py 文件)后,没有一个对我有用。
对我有用的解决方案是(Windows 解决方案): 将项目文件夹(不是包文件夹)添加到 python 路径(设置 PYTHONPATH=%PYTHONPATH%;%CD%)
从项目文件夹中运行我的脚本,然后就成功了。
【讨论】:
我遇到了类似的问题,不得不从根目录中删除__init__.py,并将__init__.py 添加到tests 文件夹中。
【讨论】:
使用 Python 3 并在类似的项目布局中遇到相同的错误,我通过将 __init__ 文件添加到我的 tests 模块来解决它。
$ touch tests/__init__.py
我不擅长打包和导入,但我认为这有助于pytest 找出目标App 模块所在的位置。
【讨论】:
coverage run -m pytest 或 python -m pytest 它可以工作,但如果我直接运行 pytest 失败,则失败加载模块错误。
我已经在/App/App 目录中有一个__init__.py 文件,并且想从项目根目录运行测试,而不需要任何路径修改魔法:
python -m pytest tests
输出立即如下所示:
➟ python -m pytest tests
====================================== test session starts ======================================
platform linux -- Python 3.5.1, pytest-2.9.0, py-1.4.31, pluggy-0.3.1
rootdir: /home/andrew/code/app, inifile:
plugins: teamcity-messages-1.17
collected 46 items
... lines omitted ...
============================= 44 passed, 2 skipped in 1.61 seconds ==============================
【讨论】:
py.test没有发现/App/App的原因吗?
python -m pytest tests 拯救了我的一天
所以你从/App 运行py.test。你确定/App/App 在你的$PYTHONPATH 中吗?
如果不是,尝试import app 的代码将失败并显示这样的消息。
EDIT0: 包括我下面评论中的信息,以确保完整性。
只有在/App/App 内执行导入应用程序的尝试才会成功,这里不是这种情况。您可能希望通过将__init__.py 放入其中来制作/App/App 一个包,并将您的导入更改为将应用程序限定为from App import app。
EDIT1: 应要求,在下面的第二条评论中添加进一步的解释。
通过将__init__.py 放入/App/App,该目录就变成了一个包。这意味着您可以从中导入,只要它 - 目录 - 在 $PYTHONPATH 中可见。 IE。如果/App 在$PYTHONPATH 中,你可以从App import app 开始。您当前的工作目录会自动添加到 $PYTHONPATH,因此当您从 /App 运行脚本时,导入将起作用。
【讨论】:
/App 上运行了pip install -e .,所以这个包被安装到了/usr/local 库中。我认为这会将我的文件夹添加到路径中?
/App/App 没有理由自动添加到$PYTHONPATH 中,无论您将pip 安装在何处。对import app 的尝试只有在inside /App/App 执行时才会成功,这里的情况并非如此。您可能希望通过将__init__.py 放入其中来制作/App/App 一个包,并将您的导入更改为将app 限定为from App import app。
/App/App 文件夹中,python 会自动将/App/App 文件夹插入到路径中?
__init__.py 放入/App/App,该目录就变成了一个包。这意味着您可以从中导入,只要它 - 目录 - 在 $PYTHONPATH 中可见。 IE。如果/App 在$PYTHONPATH 中,您可以执行from App import app。您当前的工作目录会自动添加到 $PYTHONPATH,因此当您从 /App 运行脚本时,导入将起作用。