我發現setup.py
for httplib2
似乎有一個優雅的方式來支持Python 2.x和3.x.所以我決定複製該方法。
這個任務是製作一個單一的setup.py
用於與所有支持的Python發行版配合使用的包發行版。然後用相同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
子目錄,並在python3
子目錄的Python 3.x的代碼。
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)我指定的基礎目錄爲t使用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
源代碼。
'easy_install'不適用於Python 3.x – jfs
那麼'pip'呢? –
'easy_install'的Distribute版本對Python 3.x(http://pypi.python.org/pypi/distribute)有效。 –