python库的一般约定还有一个接口模块?

时间:2010-10-18 19:30:38

标签: python distribution conventions distutils

现在我有一个具有以下布局的项目:

foo/
  __init__.py
  __main__.py
  foo.py

在这种情况下,foo.py实际上是主要的api文件,因此开发人员应该“从foo import foo”执行操作,但我也希望这样做以便最终用户可以运行{{1}并获得一个界面。

当我执行distutils安装时,创建~$ foo因为(a)我不知道如何使用distutils,[不太重要]和(b)我不确定通常认为是什么做正确的事。

据我所知,我有三个选择:

  1. 让distutils变得更聪明,以便/usr/bin/__main__.py创建 符号链接setup.py install。这是我的 直接的直觉,我可能想出怎么做, 虽然我想做的事情都像黑客一样 我没有找到任何人谈论这个。

  2. 在分发之前将/usr/bin/foo -> $PYTHONLIB/foo/__main__.py重命名为__main__.py,并将调用修改为 distutils的设置为foo。这与(1)非常相似,除非发生这种情况,我认为。

  3. 只是不要包含带有库包的接口。我觉得 这样主要取决于库/接口的大小 是否有意义。

  4. 我没有看到很多包含setup(scripts=['foo'], ...)的软件包,如果有的话,所以我不确定人们是否只是不使用它们,或者我没有使用正确的软件包。我无法找到任何关于__main__.py和distutils的博文或文章的事实告诉我,它不是一个特别受欢迎的组合。

2 个答案:

答案 0 :(得分:3)

调用模块__main__.py是一个坏主意,因为该名称具有特殊含义。而是使用__init__.py中的main sentinel并创建一个exec python -m foo的脚本。

答案 1 :(得分:1)

将Ignacio Vazquez-Abrams的回答与一些谷歌搜索结合起来,导致我找到this article about using _main_.py,我想我可能会采用以下几种布局:

foo/
    foo/
        __main__.py
        ...
    scripts/
        foo

其中scripts/foo只是

#!/bin/sh
exec python foo "$@"

这似乎会干净利落地安装,让人们无需安装即可使用我的模块,只需执行python path/to/foo