如何组织PyPI的Python模块以支持2.x和3.x.

Cra*_*een 17 python software-distribution python-2.x python-3.x

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

但是,遵循在这些地方制作模块的指导原则:

我不清楚如何为不同版本的Python支持多个源代码发布,并且不清楚PyPI是否/如何支持它.我设想我会有单独的代码:

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

如何在PyPI中设置Python模块,以便有人可以:

easy_install modulename
Run Code Online (Sandbox Code Playgroud)

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

Cra*_*een 18

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

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

python2 setup.py install
Run Code Online (Sandbox Code Playgroud)

以及

python3 setup.py install
Run Code Online (Sandbox Code Playgroud)

应该可以保持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)I把C扩展代码2.x和3.x在一个src目录下python2python3.

所以,目录结构是:

root
  |
  +--python2
  |     |
  |     +--src
  |
  +--python3
  |     |
  |     +--src
  |
  +--setup.py
  +--MANIFEST.in
Run Code Online (Sandbox Code Playgroud)

3)在setup.py,我有这些线靠近顶部:

if sys.version_info[0] == 2:
    base_dir = 'python2'
elif sys.version_info[0] == 3:
    base_dir = 'python3'
Run Code Online (Sandbox Code Playgroud)

4)在调用中setup,我将包指定为正常:

setup(
    ...
    packages=[ 'cobs', 'cobs.cobs', 'cobs.cobsr', ],
Run Code Online (Sandbox Code Playgroud)

5)我使用一个package_dir选项为Python代码指定了基本目录(参考步骤3 base_dir):

    package_dir={
        'cobs' : base_dir + '/cobs',
    },
Run Code Online (Sandbox Code Playgroud)

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', ]),
    ],
Run Code Online (Sandbox Code Playgroud)

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

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

python2 setup.py sdist
Run Code Online (Sandbox Code Playgroud)

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

include *.txt
recursive-include python2 *
recursive-include python3 *
Run Code Online (Sandbox Code Playgroud)

要查看我的操作,请参阅PyPIBitBucketcobs上的源代码.