2010-03-08 36 views
17

我有一個Python模塊,我想上傳到PyPI。到目前爲止,它正在爲Python 2.x工作。現在爲3.x編寫一個版本應該不會太難。如何組織PyPI的Python模塊以支持2.x和3.x

但是,下列人員在這些地方使模塊準則後:

這不是我清楚如何支持不同版本的Python的多個源分佈,目前還不清楚PyPI是否可以支持它。我設想我會單獨代碼:

  • 2.x的
  • 2.6(也許,作爲一個特殊的情況下,使用新的緩衝API)
  • 3.X

如何有可能建立一個Python模塊中的PyPI從而使他人能夠做到:

easy_install modulename 

它將安裝正確的事情的用戶是否正在使用x或3 x?

+0

'easy_install'不適用於Python 3.x – jfs

+0

那麼'pip'呢? –

+1

'easy_install'的Distribute版本對Python 3.x(http://pypi.python.org/pypi/distribute)有效。 –

回答

18

我發現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目錄下的python2python3

因此,目錄結構是:

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.pysetup.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 * 

要見我做什麼,看到PyPIBitBucketcobs源代碼。

+0

不知道爲什麼像這樣寫的東西不在前面提到的指南之一或我能找到的任何其他地方。我剛剛將我的第一個pkg上傳到pypi,它是爲py3編寫的,但我想以一種合理的方式支持py2。我認爲這會有所幫助。 – Zeb

2

最簡單的解決方案是使用單一來源分佈。

+0

我可以製作一個源代碼發行版,例如目錄'python2'和'python3',每個包含它們自己的'setup.py'和該Python版本的模塊代碼。你是這個意思嗎? –

+0

該解決方案似乎與http://docs.python.org/3.1/install/index.html#platform-variations –

+1

@Craig McQueen中的建議「您應該始終從發行根目錄運行安裝程序命令」相沖突:應該有唯一的'setup.py'文件。看看在PyPI上支持2.x和3.x的軟件包http://pypi.python.org/pypi?:action=browse&c=5&c=531&c=533 – jfs