Domanda

Ho un modulo Python che vorrei caricare PyPI. Finora, si sta lavorando per Python 2.x. Non dovrebbe essere troppo difficile da scrivere una versione per 3.x ora.

Ma, dopo aver seguito le linee guida per rendere i moduli in questi luoghi:

non è chiaro per me come sostenere distribuzioni multiple di origine per le diverse versioni di Python, e non è chiaro se / come PyPI potrebbe sostenerla. Mi prevedere avrei codice separato per:

  • 2.x
  • 2.6 (forse, come un caso speciale per utilizzare la nuova API buffer)
  • 3.x

Come è possibile impostare un modulo Python in PyPI in modo che qualcuno possa fare:

easy_install modulename

e installerà la cosa giusta se l'utente sta utilizzando 2.x o 3.x?

È stato utile?

Soluzione

ho scoperto che setup.py per httplib2 sembra avere un modo elegante per il supporto Python 2.xe 3.x. Così ho deciso di copiare quel metodo.

Il compito è quello di predisporre un singolo setup.py per la distribuzione del pacchetto che funziona con tutte le distribuzioni supportate Python. Poi, con la stessa setup.py, si può fare:

python2 setup.py install

così come

python3 setup.py install

Dovrebbe essere possibile mantenere setup.py abbastanza semplici da analizzare con tutte le distribuzioni di Python supportate. Ho fatto con successo così con un pacchetto di cobs supportati da 2.4 a 2.6 e 3.1. Tale pacchetto include il codice puro Python (codice separato per Python 2.xe 3.x) e le estensioni C, scritta separatamente per 2.xe 3.x.

Per farlo:

1) Ho messo il codice Python 2.x in una sottodirectory python2, e codice Python 3.x in una sottodirectory python3.

2) Ho messo il codice di estensione C per 2.xe 3.x in una directory src sotto python2 e python3.

Quindi, la struttura di directory è:

root
  |
  +--python2
  |     |
  |     +--src
  |
  +--python3
  |     |
  |     +--src
  |
  +--setup.py
  +--MANIFEST.in

3) Nella setup.py, ho avuto queste righe nella parte superiore:

if sys.version_info[0] == 2:
    base_dir = 'python2'
elif sys.version_info[0] == 3:
    base_dir = 'python3'

4) Nella chiamata a setup, ho specificato i pacchetti come normale:

setup(
    ...
    packages=[ 'cobs', 'cobs.cobs', 'cobs.cobsr', ],

5) ho specificato la directory di base per il codice Python utilizzando un'opzione package_dir (fare riferimento al punto 3 per base_dir):

    package_dir={
        'cobs' : base_dir + '/cobs',
    },

6) Per le estensioni C, ho dato il percorso:

    ext_modules=[
        Extension('cobs.cobs._cobs_ext', [ base_dir + '/src/_cobs_ext.c', ]),
        Extension('cobs.cobsr._cobsr_ext', [ base_dir + '/src/_cobsr_ext.c', ]),
    ],

Questo è stato su di esso per setup.py. Il file è setup.py analizzabili sia 2.xe Python 3.x.

7) Infine, se si crea una distribuzione sorgente utilizzando:

python2 setup.py sdist

allora sarà da tirare default in solo i file che sono specificamente necessari per costruire per quella Python. Per esempio. nel caso di cui sopra, si otterrebbe solo i file sotto python2 nella distribuzione sorgente, ma non quelli sotto python3. Ma per una distribuzione sorgente completo, si desidera includere i file sia per 2.xe 3.x. Per fare questo, creare un file MANIFEST.in che contiene qualcosa di simile:

include *.txt
recursive-include python2 *
recursive-include python3 *

Per vedere quello che ho fatto, vedere il codice sorgente cobs su PyPI o BitBucket .

Altri suggerimenti

La soluzione più semplice è quella di utilizzare una singola fonte di distribuzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top