2008-11-30 113 views
2

我在想如何安排这将有位于/ usr/bin中/一部署Python应用程序共享包

  1. 可执行脚本,这将提供一个命令行界面的功能在
  2. 实施的部署Python应用程序
  3. 将库安装到当前站点包目录所在的位置。

现在,现在,我在我的源目录结构如下:

foo.py 
foo/ 
    __init__.py 
    ... 

我的猜测是不是做事情的最好方法。在开发过程中,一切都按预期工作,但是当部署时,foo.py中的“from foo import FooObject”代码似乎尝试导入foo.py本身,这不是我正在寻找的行为。

所以,问题是什么是策划这样的情况下的标准做法?我能想到的一个事情是,在安装时,将foo.py重命名为foo,这会阻止它自动导入,但这看起来很尴尬......

我想这个问题的另一部分是这是一个命名挑战。也许调用可执行脚本foo-bin.py?

+0

这不一样.. http://stackoverflow.com/questions/17893/whats-the-best-way-to-distribute-python-command-line-tools – dbr 2008-11-30 07:52:25

回答

5

This article很不错,并且向你展示了一个很好的方法。从做的第二项列表回答你的问题。

无耻的复制粘贴:

通过Jp Calderone

做一个Python项目的

文件系统结构:

  • 将该目录命名为与您的项目相关的内容。例如,如果您的 项目名为“Twisted”,请将 顶级目录命名为其源 文件Twisted。当您执行发行版时,您应该包含版本号 后缀:Twisted-2.5
  • 创建一个目录Twisted/bin并把你的可执行文件存在,如果你有 有任何。不要给他们一个.py 扩展名,即使他们是Python 源文件。不要在 中放置任何代码,除了在项目中导入并呼叫 主函数定义的其他地方 。
  • 如果您的项目可作为单个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等文件中放置测试。
  • add Twisted/README and Twisted/setup.py to explain and 分别安装你的软件, 如果你感觉不错。

不要:

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

+0

这是好东西,我会用它,但我也想在Windows上工作。从Python文件中删除'.py'扩展名在那里似乎不太可行。我错过了什么吗?你的安装过程会把它们放回去,还是把它们包裹起来? – 2009-07-19 15:33:34

0

你应该调用可执行程序只是foo,不foo.py,然后尝试导入foo将不会使用它。

至于命名正确:这是很难回答的抽象;我们需要知道它具体做了什么。例如,如果它配置和控制,调用它-config或ctl可能是合适的。如果它是该库的shell API,则它应该与该库具有相同的名称。

+0

目录被命名为foo,所以这显然不起作用。次好的是bin/foo,但是你必须用sys.path来找到你的包目录。 – Rhamphoryncus 2009-05-29 05:02:05

2

Distutils支持安装模块,包和脚本。如果创建的distutils setup.py是指foo作为包装和foo.py为脚本,然后foo.py应该得到安装/usr/local/bin或任何相应的脚本安装路径是目标操作系统上,而foo包应该得到安装到site_packages目录。

0

您的CLI模块是一回事,支持它的包是另一回事。不要混淆的名称枝条模块foo(在文件foo.py)和封装foo(在目录foo与文件__init__.py)。

你有两件事情名为foo:模块和一个包。你还想要什么名字foo?一类?一个函数?一个变量?

为Foo模块或foo软件包选择一个独特的名字。例如,foolib是一个流行的软件包名称。