2010-07-14 30 views
1

我有一个这样的目录struture:问题与Python包和测试

project 
| __init__.py 
| project.py 
| src/ 
    | __init__.py 
    | class_one.py 
    | class_two.py 
| test/ 
    | __init__.py 
    | test_class_one.py 

其中project.py只是实例ClassOne并运行它。

我的问题是在测试中,我不知道如何导入src类。我试图导入这些方法,我得到了什么:

from project.src.class_one import ClassOne 

from ..src.class_one import ClassOne 

我在做什么错?有更好的目录结构吗?

----- -----编辑

我改变了我的目录结构,它现在是这样的:

Project/ 
| project.py 
| project/ 
    | __init__.py 
    | class_one.py 
    | class_two.py 
    | test/ 
     | __init__.py 
     | test_class_one.py 

而在test_class_one.py文件我想以这种方式导入:

from project.class_one import ClassOne 

而且它仍然不起作用。我没有在bin目录中使用可执行文件project.py,因为我无法从更高级目录中导入软件包。 :(

感谢= d

+0

当您运行测试时,您有哪些目录? – bstpierre 2010-07-14 23:52:35

+0

在测试目录中,这是错误的吗? = P – CrociDB 2010-07-14 23:57:40

回答

1

这一切都取决于你的Python路径。实现您想要在此处执行的最简单方法是将PYTHONPATH环境变量设置为“项目”目录所在的位置。例如,如果你的来源是生活在:

/Users/crocidb/src/project/ 

我想:

export PYTHONPATH=/Users/crocidb/src 

然后在test_one.py我能:

import project.src.class_one 

其实我可能会做这样:

export PYTHONPATH=/Users/crocidb/src/project 

和th这在test_one中。py:

import src.class_one 

但这只是我的偏好,真的取决于你的层次结构的其余部分。还要注意的是,如果你已经在PYTHONPATH东西你要添加到它:

export PYTHONPATH=/Users/crocidb/src/project:$PYTHONPATH 

或其他命令,如果你想成为最后搜查你的项目路径。

这一切都适用于Windows,除非您需要使用windows的语法来设置环境变量。

+0

更多信息:http://docs.python.org/tutorial/modules.html#the-module-search-path – devguydavid 2010-07-14 23:56:27

+0

它的工作!我只需将我的项目的目录添加到PYTHONPATH中。谢谢。 = d – CrociDB 2010-07-15 00:32:58

0

Jp Calderone's excellent blog post

务必:例如,如果你的 项目被命名为“

  • 名称目录的东西与你的项目。 Twisted“,将 顶级目录命名为其源 文件Twisted。当您执行发行版时, 应包含版本号er 后缀:Twisted-2.5。
  • 创建一个目录Twisted/bin并将您的可执行文件放在那里,如果你有 有任何问题。不要给他们一个.py 扩展名,即使他们是Python 源文件。不要在 中放置任何代码,除了在项目中导入并呼叫 主函数定义的其他地方 。 (轻微的皱纹: 因为在Windows中,解释是 通过文件扩展名选择,您 Windows用户真正做到想的.py 延长所以,当你打包 Windows,则可能需要添加它 可惜。有没有简单的 distutils的把戏,我所知道的 自动完成这一过程。考虑 上POSIX .py扩展名是 只疣,而在Windows上 缺乏确实是个bug,如果你的 的用户群包括Windows用户,你可能想选择在任何地方扩展.py 。)
  • 如果您的项目可作为单个Python源文件表达,则将其 放入该目录中,并将其命名为 与您的项目相关的内容。例如,对于 Twisted/twisted.py。如果您的 需要多个源文件,请创建一个 包(而不是Twisted/twisted /, ,其中包含一个空的 Twisted/twisted/__ init__.py),并将 源文件放入其中。例如, Twisted/twisted/internet.py。
  • 把你的单元测试在程序包中的子包(注 - 这意味着 ,单一Python源文件 选项上面是一招 - 你总是 需要您 单元测试至少一种其他文件)。例如, 扭曲/扭曲/测试/。当然,制作 它包含 Twisted/twisted/test/__ init__.py。 将测试放在 Twisted/twisted/test/test_internet.py等文件中。
  • 添加Twisted/README和Twisted/setup.py来解释和 分别安装您的软件, ,如果你感觉不错。

不要:

  • 把你的源目录中名为src或库。这使得难以运行 而无需安装。
  • 把你的测试放到你的Python包之外。这使得 难以针对已安装的 版本运行测试。
  • 创建一个仅包含__init__.py的包,然后将所有代码放入__init__.py。只需制作一个模块 而不是一个包,它更简单。
  • 尝试拿出神奇的黑客,才能使Python能够导入模块 或包,而无需用户将其包含到他们的 导入路径的目录(通过PYTHONPATH或 其他一些机制)添加 。您不会 正确处理所有情况,并且当您的 软件不能在其环境中工作时,用户 会对您生气。
+0

不错的提示,但我仍然有问题导入更高级别的软件包。 – CrociDB 2010-07-14 23:29:15