我发现setup.py
forhttplib2
似乎有一种优雅的方式来支持 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
中。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', ],
package_dir
5) 我使用一个选项指定了 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或BitBucketcobs
上的源代码。