【问题标题】:I'd like some advice on packaging this as an egg and uploading it to pypi我想要一些关于将其包装为鸡蛋并将其上传到 pypi 的建议
【发布时间】:2010-11-21 01:30:22
【问题描述】:

我写了一些我想打包成鸡蛋的代码。这是我的目录结构:

源/ 源/测试 src/tests/test.py # 这对电影名称解析器有几个测试 源/种子 src/torrent/__init__.py src/torrent/movienameparser src/torrent/movienameparser/__init__.py # 这包含代码

我想把这个目录结构打包成一个egg,并包含测试文件。我应该在 setup.py 文件中包含什么,以便我可以拥有任意数量的命名空间和任意数量的测试?

这是我想分享的第一个开源代码。尽管可能只有我会觉得这个模块有用,但我还是想把它上传到pypi。我可以使用什么许可证来允许用户使用代码做他们想做的事,对重新分发没有限制,修改?

尽管我计划更新这个 egg,但我不想对任何事情负责(例如为用户提供支持)。我知道这听起来很自私,但这是我的第一个开源代码,所以请多多包涵。我需要提供许可证的副本吗?我在哪里可以找到副本?

感谢您阅读所有这些内容。

【问题讨论】:

  • 你应该用'setuptools'和'distutils'来标记它。
  • 我已经更新了标签。也许现在它会产生更多的兴趣:)

标签: python setuptools distutils egg pypi


【解决方案1】:

包含来自setuptools website 的 ez_setup 文件,并包含在 setup.py 的顶部:

from ez_setup import use_setuptools
use_setuptools()

这个脚本是没有安装工具的人的助手。它会在未安装 setuptools 的系统上下载并安装最新版本的 setuptools。

【讨论】:

    【解决方案2】:

    我不会在这里讨论许可问题,但通常会在包源代码的根目录中包含 LICENSE 文件,以及 README 等其他常规内容。

    我通常以安装在目标系统上的相同方式组织包。标准封装布局约定解释here.

    例如,如果我的包是“torrent”并且它有几个子包,例如“tests”和“util”,那么源代码树如下所示:

    工作区/torrent/setup.py 工作区/torrent/torrent/__init__.py 工作区/torrent/torrent/foo.py 工作区/torrent/torrent/bar.py 工作区/洪流/洪流/... 工作区/torrent/torrent/tests/__init__.py 工作区/torrent/torrent/tests/test.py 工作区/洪流/洪流/测试/... 工作区/torrent/torrent/util/__init__.py 工作区/torrent/torrent/util/helper1.py 工作区/torrent/torrent/util/...

    这个“torrent/torrent”位似乎是多余的,但这是这个标准约定和 Python 导入工作方式的副作用。

    这是极简主义的setup.py(更多信息请访问how to write the setup script):

    #!/usr/bin/env python
    
    from distutils.core import setup
    
    setup(name='torrent',
          version='0.1',
          description='would be nice',
          packages=['torrent', 'torrent.tests', 'torrent.util']
    )
    

    要获得源发行版,我会这样做:

    $ cd 工作区/种子
    $ ./setup.py sdist
    

    这个发行版 (dist/torrent-0.1.tar.gz) 可以单独使用,只需解压并运行setup.py install 或使用setuptools 工具包中的easy_install。而且您不必为每个受支持的 Python 版本制作多个“彩蛋”。

    如果你真的需要一个鸡蛋,你需要在你的setup.py中添加一个对setuptools的依赖,这将引入一个额外的子命令bdist_egg来生成鸡蛋。

    但是setuptools 除了产蛋质量之外还有另一个优点,它消除了在setup.py 中枚举包的需要,并带有一个很好的辅助函数find_packages

    #!/usr/bin/env python
    
    from setuptools import setup, find_packages
    
    setup(name='torrent',
          version='0.1',
          description='would be nice',
          packages=find_packages()
    )
    

    那么,为了得到一个“蛋”,我会这样做:

    $ cd 工作区
    $ ./setup.py bdist_egg
    

    ...它会给我鸡蛋文件:dist/torrent-0.1-py2.6.egg

    注意py2.6 后缀,这是因为在我的机器上我有 Python 2.6。如果你想取悦很多人,你需要为每个主要的 Python 版本发布一个 egg。您不希望成群结队的 Python 2.5 人在家门口拿着斧头和长矛,对吗?

    但你不必构建一个鸡蛋,你仍然可以使用sdist 子命令。

    更新:这里是 Python 文档中的 another useful page,它从用户的角度介绍了 Distutils

    【讨论】:

      【解决方案3】:

      最好将它作为 tarball (.tar.gz) 分发,而不是作为鸡蛋分发。 Eggs 主要用于二进制分发,例如在使用已编译的 C 扩展时。在纯源代码发行版中,它们只是不必要的复杂性。

      如果您只是想将您的代码公开发布,那么 MIT 或 3 条款 BSD 许可证是最受欢迎的选择。两者都包括免责声明。您所要做的就是在 tarball 中包含主许可证;通常为“License.txt”或类似名称。或者,您可以为每个源文件添加一个小的版权通知;我鼓励这样做,因此即使没有整个存档,每个文件的状态也很明显,但有些人认为这太冗长了。这是个人喜好问题。

      BSD 许可证在Wikipdia 上可用,复制如下:

      Copyright (c) <year>, <copyright holder>
      All rights reserved.
      
      Redistribution and use in source and binary forms, with or without
      modification, are permitted provided that the following conditions are met:
          * Redistributions of source code must retain the above copyright
            notice, this list of conditions and the following disclaimer.
          * Redistributions in binary form must reproduce the above copyright
            notice, this list of conditions and the following disclaimer in the
            documentation and/or other materials provided with the distribution.
          * Neither the name of the <organization> nor the
            names of its contributors may be used to endorse or promote products
            derived from this software without specific prior written permission.
      
      THIS SOFTWARE IS PROVIDED BY <copyright holder> ''AS IS'' AND ANY
      EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
      DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
      DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
      (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
      LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
      ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
      (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
      SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      

      【讨论】:

        猜你喜欢
        • 2012-11-07
        • 2011-02-17
        • 2021-05-06
        • 2011-02-05
        • 2021-08-03
        • 2010-11-09
        • 2020-05-03
        • 2010-11-03
        • 2017-03-08
        相关资源
        最近更新 更多