我发现setup.py for httplib2 似乎有一种优雅的方式来支持 Python 2.x 和 3.x。所以我决定复制那个方法。
任务是为适用于所有受支持的 Python 发行版的软件包发行版制作一个 setup.py。然后用同样的setup.py,你可以这样做:
python2 setup.py install
还有
python3 setup.py install
应该可以保持setup.py 足够简单,以便使用所有受支持的 Python 发行版进行解析。我已经使用支持 2.4 到 2.6 以及 3.1 的包 cobs 成功地做到了这一点。该包包括纯 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 扩展代码放在 src 目录下的 python2 和 python3。
所以,目录结构是:
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', ],
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 文件可由 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 *
要查看我做了什么,请查看PyPI 或BitBucket 上的cobs 源代码。