2011-10-03 10 views
11

Ho un progetto Python 2 ('foo 0.1.7') che richiede Python 2.4 o successivo.Qual è il modo migliore per distribuire un pacchetto Python che richiede una versione minima di Python

Ora l'ho portato su Python 3 ('foo 0.2.0') in modo che sia ancora compatibile con Python 2, ma i requisiti sono ora risolti in Python 2.6 o versioni successive.

  • So che c'è un'opzione per --target-version=2.6 setup.py, che può essere utilizzato con upload, ma questo non sembra essere inteso come '2.6 o superiore'
  • Il comando setup ha un'opzione install_requires, ma questo è per i pacchetti richiesti, .not interprete Python.

avrei potuto fare qualcosa di simile in setup.py di 'foo 0.2.0':

if sys.hexversion < 0x02060000: 
    raise RuntimeError('This package requires Python 2.6 or later, try foo 0.1.7') 

ma io preferirei se easy_install foo sarebbe risolvere questo in qualche modo.

Quindi, come devo distribuirlo su PyPI?

risposta

2

Quello che sembra che tu stia cercando è un modo per caricare entrambe le versioni 0.1.7 e 0.2.0 del tuo programma, e avere easy_install-2.5 usa automaticamente 0.1.7, mentre easy_install-2.6 userebbe 0.2. 0.

Se questo è il caso, non sono sicuro che sia possibile fare con il sistema attuale ... il controllo raise RuntimeError() potrebbe essere la migliore opzione attualmente disponibile; le persone che installano il tuo progetto dovrebbero quindi manualmente easy_install-2.5 -U "proj<0.2" o qualcosa di simile.

Detto questo, un gruppo dedicato sta attualmente lavorando per sostituire distutils, setuptools, ecc. Con una libreria aggiornata denominata packaging. Questa nuova libreria combina le funzionalità delle librerie di miglioramento delle distutils esistenti e una serie di altri miglioramenti. È previsto l'inclusione in Python 3.3 e quindi il backport come distutils2.

Di particolare rilevanza per la tua domanda, contiene molti miglioramenti ai metadati di installazione; inclusa l'opzione "requires_python", che sembra fatta su misura per indicare esattamente le informazioni che desideri. Tuttavia, non sono sicuro del modo in cui intendono utilizzare queste informazioni e se ciò causerà il nuovo sistema di installazione come si desidera.

Avrei consigliato di postare su the fellowship of the packaging, il gruppo google dedicato allo sviluppo del nuovo sistema, sarebbero in grado di fornire dettagli su come requires_python si suppone che funzioni ... e possibilmente ottenere il comportamento di installazione che si desidera in al piano terra del nuovo sistema se sembra fattibile (e non è già lì).

4

So che c'è un --target-version = 2.6 opzione per setup.py, che può essere utilizzato con caricati, ma questo non sembra essere inteso come '2.6 o superiore'

In realtà è un'opzione per bdist_wininst o bdist_msi e in effetti non include "o superiore".

Il comando di installazione ha un'opzione install_requires, ma questo è per i pacchetti richiesti , .not interprete Python.

Forse mettendo 'Python> = 2.6' in install_requires potrebbero funzionare: Python 2.5 fino a 3,2 creano un file Python-blahblah-pyXY.egg-info, quindi, se siete fortunati easy_install possono trovare che il requisito è soddisfatto. In caso contrario sarà probabilmente cercherà di scaricare da PyPI, così uh ...

avrei potuto fare qualcosa di simile in setup.py di 'foo 0.2.0': se sys.hexversion < 0x02060000: rilancio RuntimeError ('Questo pacchetto richiede Python 2.6 o successivo, prova a 0.1.7')

Questo è in realtà l'attuale linguaggio comune. Inoltre, utilizzando i classificatori di "Programming Language :: Python :: X.Y" verranno fornite informazioni per gli esseri umani (non sono a conoscenza di alcun strumento che usi tali informazioni).

Nel futuro a breve termine, c'è speranza. La specifica per i metadati delle distribuzioni Python è stata aggiornata e la versione più recente contiene un campo per richiedere una versione Python specifica: http://www.python.org/dev/peps/pep-0345/#requires-python

Per quanto riguarda il supporto degli strumenti: le distutils sono bloccate e non la supportano, setuptools può o non può aggiungere supporto, la sua fork distribution probabilmente otterrà supporto, e distutils2/packaging lo supporta già. distutils2 include un programma di installazione di base chiamato pysetup, che dovrebbe rispettare il campo Requires-Python (in caso contrario, si prega di segnalare a bugs.python.org).

Ora, per affrontare il problema in questo momento, si può fare una di queste cose: - dichiara che il progetto supporta solo 2.6+ - documento che 2.4 gli utenti devono appuntare la versione durante il download (ad esempio pip install "pippo == 0.1.7 ")

+0

+1 per questa risposta dettagliata, grazie! – mar10

Problemi correlati