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

2024-05-20 14:17:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python模块,我想上传到PyPI。到目前为止,它是为Python2.x工作的,现在为3.x编写一个版本应该不难。在

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

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

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

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

easy_install modulename

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


Tags: 模块theto版本pypimodules源代码地方
2条回答

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

我发现^{} for ^{}似乎有一种优雅的方式来支持python2.x和3.x,所以我决定复制这个方法。在

任务是为包发行版设计一个单独的setup.py,它与所有受支持的Python发行版一起工作。然后使用相同的setup.py,您可以:

python2 setup.py install

以及

^{pr2}$

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

要做到这一点:

1)我将python2.x代码放入python2子目录,python3.x代码放在python3子目录中。在

2)我把2.x和3.x的C扩展代码放在python2和{}下的src目录中。在

因此,目录结构是:

^{3}$

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', ],

5)我使用package_dir选项为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文件可由python2.x和3.x解析

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

python2 setup.py sdist

然后,默认情况下,它将只拉入专门为该Python构建所需的文件。E、 g.在上面的例子中,您只能得到源发行版中python2下的文件,而不能得到python3下的文件。但是对于完整的源代码分发,您需要同时包含2.x和3.x的文件。为此,请创建一个MANIFEST.in文件,其中包含如下内容:

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

要查看我做了什么,请参阅PyPIBitBucket上的cobs源代码。在

相关问题 更多 >