【问题标题】:Import parent directory for brief tests导入父目录进行简要测试
【发布时间】:2012-07-12 05:32:13
【问题描述】:

我已经从头到尾搜索了这个站点,但还没有找到一种方法可以在 Python3x 中真正实现我想要的。这是一个简单的玩具应用程序,所以我想我可以在断言中编写一些简单的测试用例,然后收工。它确实会生成报告等,所以我想确保我的代码在更改时不会做任何奇怪的事情。

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

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

我在让 my_file_test.py 导入 my_file.py 时遇到了麻烦。

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

之前的尝试: 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 作为一种学习体验,

【问题讨论】:

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


    【解决方案1】:

    像这样构造你的代码:

    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 标准实践而不是反对它们会容易得多。这意味着在他们自己的顶级目录中使用测试来构建您的项目。

    【讨论】:

    • 谢谢。我今晚会试一试。这与我最初的结构相似,但我偶然发现了一些资源,表明我应该以这种方式构建它。下班后我会告诉你情况如何。
    • 这会导致第 1 行(导入语句)出现“ImportError: No module named model”错误。这张照片是怎么回事。
    • 我的班级是否需要某种明确的注释才能使其可导入?不是很精通python,而且我已经有一段时间没有使用它了(当时只是教学能力)。
    • ...我应该在 init.py 中有内容吗?似乎没有任何迹象表明它应该有任何东西
    • @Rig no,__init__.py 允许为空。我忘了指定 tests 也应该有一个 __init__.py 并使用 -m 语法调用测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2013-11-09
    相关资源
    最近更新 更多