17

我有一个 Python 模块,我想上传到 PyPI。到目前为止,它适用于 Python 2.x。现在为 3.x 编写一个版本应该不会太难。

但是,在遵循在这些地方制作模块的指南之后:

我不清楚如何支持不同版本的 Python 的多个源代码分发,也不清楚 PyPI 是否/如何支持它。我想我会有单独的代码:

  • 2.x
  • 2.6(也许,作为使用新缓冲区API的特殊情况)
  • 3.x

如何在 PyPI 中设置 Python 模块以便有人可以执行以下操作:

easy_install modulename

无论用户使用的是 2.x 还是 3.x,它都会安装正确的东西?

4

2 回答 2

18

我发现setup.pyforhttplib2似乎有一种优雅的方式来支持 Python 2.x 和 3.x。所以我决定复制那个方法。

任务是为所有受支持的 Python 发行版制作一个setup.py包发行版。然后用同样的setup.py方法,你可以这样做:

python2 setup.py install

python3 setup.py install

应该可以保持setup.py足够简单,以便使用所有受支持的 Python 发行版进行解析。cobs我已经使用支持 2.4 到 2.6 以及 3.1的软件包成功地做到了这一点。该包包括纯 Python 代码(Python 2.x 和 3.x 的单独代码)和 C 扩展,分别为 2.x 和 3.x 编写。

去做吧:

1)我把 Python 2.x 的代码放到一个python2子目录下,把 Python 3.x 的代码放到一个python3子目录下。

2) 我将 2.x 和 3.x 的 C 扩展代码放在 and 下的目录src中。python2python3

所以,目录结构是:

root
  |
  +--python2
  |     |
  |     +--src
  |
  +--python3
  |     |
  |     +--src
  |
  +--setup.py
  +--MANIFEST.in

3) 在 中setup.py,我在顶部附近有这些行:

if sys.version_info[0] == 2:
    base_dir = 'python2'
elif sys.version_info[0] == 3:
    base_dir = 'python3'

4) 在对 的调用中setup,我像往常一样指定了包:

setup(
    ...
    packages=[ 'cobs', 'cobs.cobs', 'cobs.cobsr', ],

package_dir5) 我使用一个选项指定了 Python 代码的基本目录(请参阅第 3 步base_dir):

    package_dir={
        'cobs' : base_dir + '/cobs',
    },

6) 对于 C 扩展,我给出了路径:

    ext_modules=[
        Extension('cobs.cobs._cobs_ext', [ base_dir + '/src/_cobs_ext.c', ]),
        Extension('cobs.cobsr._cobsr_ext', [ base_dir + '/src/_cobsr_ext.c', ]),
    ],

这是关于它的setup.py。该setup.py文件可由 Python 2.x 和 3.x 解析。

7) 最后,如果您使用以下方式构建源代码分发:

python2 setup.py sdist

那么默认情况下,它将仅拉入为该 Python 构建特别需要的文件。例如,在上述情况下,您只能获得python2源代码分发中的文件,而不是python3. 但是对于完整的源代码分发,您希望包含 2.x 和 3.x 的文件。为此,请创建一个MANIFEST.in包含以下内容的文件:

include *.txt
recursive-include python2 *
recursive-include python3 *

要查看我做了什么,请查看PyPIBitBucketcobs上的源代码。

于 2010-04-28T11:40:05.380 回答
1

最简单的解决方案是使用单一源分发。

于 2010-03-08T00:58:43.023 回答