我正在考虑如何安排一个部署的python应用程序,它将具有
位于/ usr/bin /中的可执行脚本,它将为实现的功能提供CLI
安装在当前site-packages目录所在的库.
现在,我目前在源代码中有以下目录结构:
foo.py foo/ __init__.py ...
我想这不是最好的做事方式.在开发过程中,一切都按预期工作,但是在部署时,foo.py中的"from foo import FooObject"代码似乎试图导入foo.py本身,这不是我正在寻找的行为.
所以问题是编排这样的情况的标准做法是什么?我能想到的一件事是,在安装时,将foo.py重命名为foo,这会阻止它自动导入,但这看起来相当尴尬......
我认为问题的另一部分是这是一个命名挑战.也许调用可执行脚本foo-bin.py?
这篇文章非常好,并向您展示了一个很好的方法.Do列表中的第二项回答了您的问题.
无耻的复制粘贴:
Python项目的文件系统结构作者:Jp Calderone
做:
将目录命名为与项目相关的内容.例如,如果您的项目名为"Twisted",请为其源文件命名顶级目录
Twisted
.执行发布时,应包含版本号后缀:Twisted-2.5
.
Twisted/bin
如果有的话,创建一个目录并将可执行文件放在那里..py
即使它们是Python源文件,也不要给它们扩展.除了导入和调用项目中其他地方定义的main函数之外,不要在其中添加任何代码.如果您的项目可以表示为单个Python源文件,那么将其放入目录并将其命名为与项目相关的内容.例如,
Twisted/twisted.py
.如果您需要多个源文件,请改为创建一个包(Twisted/twisted/
,使用空Twisted/twisted/__init__.py
)并将源文件放入其中.例如,Twisted/twisted/internet.py
.将您的单元测试放在包的子包中(注意 - 这意味着上面的单个Python源文件选项是一个技巧 - 您总是需要至少一个其他文件用于您的单元测试).例如,
Twisted/twisted/test/
.当然,让它成为一个包Twisted/twisted/test/__init__.py
.将测试放在像Twisted/twisted/test/test_internet.py
.如果你感觉很好,分别添加
Twisted/README
并Twisted/setup.py
解释和安装你的软件.
别:
将您的源放在名为
src
或的目录中lib
.这使得在没有安装的情况下很难运行.把你的测试放在你的Python包之外.这使得难以针对已安装的版本运行测试.
创建一个只包含a
__init__.py
然后将所有代码放入的包__init__.py
.只需制作一个模块而不是一个包,它就更简单了.尝试提出神奇的黑客攻击,使Python能够导入您的模块或包,而无需用户将包含它的目录添加到其导入路径(通过
PYTHONPATH
或其他一些机制).您将无法正确处理所有情况,当您的软件无法在其环境中工作时,用户会对您生气.