导入父目录以进行简短测试

时间:2012-07-12 12:53:29

标签: python-3.x fedora pythonpath project-layout

我从上到下搜索过这个网站但还没有找到一种方法来实际完成我想要的Python3x。这是一个简单的玩具应用程序,所以我想我可以在断言中编写一些简单的测试用例并将其称为一天。它确实会生成报告等等,所以我想确保我的代码在更改时不会做任何事情。

我目前的目录结构是:(仅包括相关部分)

project
  -model
     __init__.py
     my_file.py
     -test
       my_file_test.py

我有一段时间让my_file_test.py导入my_file.py。

像我说的那样。我从上到下搜索过这个网站,没有解决方案。我的Python版本是在Fedora 17上运行的3.2.3。

以前试过的尝试: https://stackoverflow.com/questions/5078590/dynamic-imports-relative-imports-in-python-3 Importing modules from parent folder Can anyone explain python's relative imports? How to accomplish relative import in python

几乎在每次尝试中我都会收到错误:

ImportError:没有名为*的模块 要么 ValueError:在非包中尝试相对导入

这里发生了什么。我已经尝试了SO以及整个互联网上的所有接受的答案。没有做任何想象的事情,但作为一个.NET / Java / Ruby程序员,这被证明是直观性的绝对定义。

编辑:如果重要的话我尝试加载我试图在REPL中导入的类,我得到以下内容:

>>> import datafileclass
>>> datafileclass.methods
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
>>> x = datafileclass('sample_data/sample_input.csv')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable

如果重要......我知道该类中的功能有效但我无法导入它,而现在导致无法测试。将来肯定会引发整合问题。 (更改名称以保护无辜者) 为这次迭代的库提供几周的期望功能...任何帮助都可能有用。本来可以在Ruby中完成它,但客户希望Python作为一种学习体验,

1 个答案:

答案 0 :(得分:9)

像这样构建你的代码:

project
  -model
    __init__.py
    my_file.py
  -tests
    __init__.py
    test_my_file.py

重要的是,您的tests目录也应该是一个模块目录(其中包含一个空的__init__.py文件)。

然后在test_my_file.py中使用from model import my_file,并从顶层目录运行python -m tests.test_my_file。这是一个模块调用test_my_file,这导致Python设置其导入路径以包含您的顶级。

更好的是,你可以使用pytest或nose,并且运行py.test会自动获取测试。

我意识到这不能回答你的问题,但是你可以更轻松地使用Python标准实践而不是反对它们。这意味着在他们自己的顶级目录中使用测试来构建项目。