我有一个像这样的目录结构:
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,因为我无法从更高级别的dir导入包。 :(
感谢。 = d
答案 0 :(得分:1)
这一切都取决于你的python路径。在这里实现您想要做的最简单的方法是将PYTHONPATH环境变量设置为“project”目录所在的位置。例如,如果您的来源居住在:
/Users/crocidb/src/project/
我会:
export PYTHONPATH=/Users/crocidb/src
然后在test_one.py中我可以:
import project.src.class_one
实际上我可能会这样做:
export PYTHONPATH=/Users/crocidb/src/project
然后在test_one.py:
中import src.class_one
但这只是我的偏好,实际上取决于你的层次结构的其余部分。另请注意,如果您已经在PYTHONPATH中添加了某些内容,则需要添加它:
export PYTHONPATH=/Users/crocidb/src/project:$PYTHONPATH
或以其他顺序,如果您希望最后搜索项目路径。
除了你需要使用windows的语法设置环境变量外,这一切都适用于Windows。
答案 1 :(得分:0)
来自Jp Calderone's excellent blog post:
执行:
- 将目录命名为与项目相关的内容。例如,如果你的 项目名为“Twisted”,名称为 其源代码的顶级目录 文件扭曲。当你发布时, 你应该包括一个版本号 后缀:Twisted-2.5。
- 创建一个目录Twisted / bin并将可执行文件放在那里,如果你 有什么。不要给他们一个.py 扩展,即使它们是Python 源文件。不要输入任何代码 他们除了导入和调用一个 主要功能在其他地方定义 在你的项目中。 (轻微的皱纹: 因为在Windows上,解释器是 由文件扩展名选择,您的 Windows用户实际上确实需要.py 延期。所以,当你打包 Windows,您可能想要添加它。 不幸的是,这并不容易 我所知道的那种诡计 自动化这个过程。考虑到 在POSIX上,.py扩展名是 只有一个疣,而在Windows上 缺乏是一个真正的错误,如果你的 userbase包括Windows用户 可能想要选择只有.py 到处扩展。)
- 如果您的项目可以表示为单个Python源文件,那么请将其放入 进入目录并命名它 与您的项目相关的东西。对于 例如,Twisted / twisted.py。如果你 需要多个源文件,创建一个 包裹代替(扭曲/扭曲/, 空着 扭曲/扭曲/ __ init__.py)和地方 你的源文件。例如, 扭曲/捻/ internet.py。
- 将您的单元测试放在包的子包中(注意 - 这意味着 单个Python源文件 上面的选项是一个技巧 - 你永远 需要至少一个其他文件 单元测试)。例如, 扭曲/捻/测试/。当然,制作 它是一个包 扭曲/捻/测试/ __ init__.py。 将测试放在像 扭曲/捻/测试/ test_internet.py。
- 添加Twisted / README和Twisted / setup.py来解释和 分别安装你的软件 如果你感觉很好。
不要:
- 将您的源代码放在名为src或lib的目录中。这很难 无需安装即可运行。
- 将您的测试放在Python包之外。这使得很难 针对已安装的运行测试 版本
- 创建一个只有__init__.py的包,然后将所有代码放入__init__.py。只需制作一个模块 而不是包,它更简单。
- 尝试提出神奇的黑客攻击,让Python能够导入你的模块 或没有用户添加的包 包含它的目录 导入路径(通过PYTHONPATH或 其他一些机制)。你不会 正确处理所有案例和用户 你的时候会生你的气 软件无法正常运行 环境。