2014-01-08 30 views
14

我有一个文件夹结构,这样Py.test无模块名为*

App 
--App 
    --app.py  
--Docs 
--Tests 
    --test_app.py 

在我test_app.py file,我有一个线导入我的应用程序模块。当我在根文件夹上运行py.test时,出现有关没有名为app的模块的错误。我应该如何配置?

回答

8

因此您从/App运行py.test。您确定/App/App在您的$PYTHONPATH

如果不是,试图import app的代码将失败,并显示此消息。

编辑0:包括我的评论下面,为了完整性的信息。

尝试导入应用程序只有在/App/App内执行时才会成功,但在此情况并非如此。您可能希望通过将__init__.py放入其中,并将其更改为from App import app以符合要求。

编辑1:根据要求,从我的第二个评论进一步解释下面。

通过将__init__.py放在/App/App之内,该目录就变成了一个包。这意味着您可以从它导入,只要它 - 目录 - 在$PYTHONPATH中可见。即如果/App位于$PYTHONPATH中,则可以从App import app开始执行。您当前的工作目录会自动添加到$PYTHONPATH,因此当您从/App运行脚本时,导入将会起作用。

+0

我在'/ App'上运行'pip install -e .',所以包被安装到'/ usr/local'库中。我想这会将我的文件夹添加到路径中? – zsljulius

+2

无论你在哪里安装'pip',没有理由将'/ App/App'自动添加到'$ PYTHONPATH'中。 “导入应用程序”的尝试只有在*'/ App/App'内执行时才会成功,在这里不是这种情况。您可能希望通过在其中放置'__init __。py'来将'/ App/App'制作为一个包,并将您的导入更改为'app from'from App import app'。 –

+0

我的测试现在可以运行。我仍然对$ PYTHONPATH部分感到困惑。如果我将__init__.py添加到我的'/ App/App'文件夹中,python会自动将'/ App/App'文件夹插入到路径中吗? – zsljulius

14

我已经有一个__init__.py文件中/App/App目录,并希望没有任何路径压延魔法运行从项目根检验:

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 ============================== 
+2

你能找出启动'py.test'直接无法发现'/ App/App'的原因吗? –

+1

well python确实将当前目录添加到pythonpath,所以你仍然使用path-mangling magic,顺便说一句,这就是为什么它的工作原理! – Danny

8

使用Python 3并在类似的项目布局上获得相同的错误,我通过向我的tests模块添加__init__文件来解决此问题。

$ touch tests/__init__.py 

我不是在包装和进口伟大的,但我认为这有助于pytest哪里工作目标App模块的位置。