【问题标题】:Distributing Python packages which depend on in-house common convenience libraries分发依赖于内部通用便利库的 Python 包
【发布时间】:2011-05-23 05:08:06
【问题描述】:

我有一些 Python 包,我想整理并在 PyPI 上发布。这些包导入了我编写的几个 Python 模块,以增强或简化某些操作(例如,通过包装 csv 函数从带有标题的 CSV 文件读取/写入),提供方便的数据结构等。目前这些模块位于包含我的项目代码的顶级目录,我依赖于通过将该目录添加到我的 PYTHONPATH 环境变量来访问它们。 (不整洁,我知道。)

通过为这些模块创建一个单独的包并将它们上传到 PyPI,我可以将这样的包标记为我实际上想要分发的包的依赖项。然而,这些便利模块很小,用途和兴趣有限,因此我认为它们不值得在 PyPI 上作为单独的包分发。另一方面,我不愿将这些便利模块(即使用cp convenience_module.py projectX/.)复制到每个项目目录中,因为这会在包含我的Python代码的VCS存储库和不同的源代码分发中创建同一文件的多个副本我会发布到 PyPI 的 tarball。这个问题有没有优雅的解决方案?

【问题讨论】:

    标签: python distribution packaging


    【解决方案1】:

    您没有说明为什么对“提供副本”犹豫不决。一般来说,我认为一个合理的方法是考虑如何为自己设置一些东西以使用便利模块。您是否将它们安装在站点包(或等效项)中,还是仅依赖于它们位于运行代码的目录中?无论您如何使用这些模块,这种情况是否理想,或者是否有一种对您更好的方法?

    从这个开始,然后通过 setup.py 弄清楚如何自动化它,它可以让你把东西放在系统上任何你想要的地方(尽管我强烈反对滥用这个功能)。

    无论您将它们作为 tarball 还是与需要它们的软件包一起分发,您仍然需要维护所有文件,因此唯一真正的问题是您是否打算开发这些便利模块他们自己的用户社区有他们自己的支持请求等,或者他们是否明确地打算仅用于支持这个其他模块。

    如果您打算将这些模块仅用于一个模块,请将它们包含在包中,也许在分发中的“utils”包中。否则,您只是将索引与人们可能认为有用的东西混为一谈,但实际上与驱动它们的更改和维护的其他东西紧密相连。

    如果您希望这些模块是通用的,并且打算照此维护它们,并且认为它们在支持此模块之外还有其他用途,请单独分发它们。

    【讨论】:

    • 我已经重新措辞了我的问题; “提供副本”暗示了与我的意思不同的东西,即“将cp 文件提供给多个源代码树”。我绝对依靠修改PYTHONPATH 环境变量来确保模块的导入工作;他们还没有在自己的 Python 包中,并带有 setup.py 给自己。另外,我不打算过多地扩展这些模块的功能。它们的内容只是我发现我想在各种项目中重复使用的功能的集合。
    【解决方案2】:

    据我所知,通过 PyPI 分发这些小包是唯一可行的选择。是的,它用几乎没用的包使索引变得混乱,但它应该由 PyPI 维护者解决,而不是包开发人员。另一种选择是使用 stdlib 或其他 util 包数据和函数,而不是重新发明轮子。

    只需确保您描述了该 utils 包,或将它们扩展为对其他人更有用的东西。

    【讨论】:

    • “是的,它用几乎没用的包使索引变得混乱,但它应该由 PyPI 维护者解决,而不是包开发人员。”这让我觉得自己不是 Python 社区的好公民。 PyPI 甚至有维护者吗?似乎要由开发商成为“好邻居”。另一方面,如果事情是这样的,那我可以接受。
    猜你喜欢
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多