2013-07-22 6 views
12

Dopo aver letto la documentazione di Python (http://www.python.org/dev/peps/pep-0396/), mi sono confuso più di prima su come impostare l'attributo __version__ per i pacchetti in modo appropriato. Si dice di inserirli nel file setup.py, che mi confonde: non sarebbe disponibile come my_package.__version__, vero?Creazione di un attributo __version__ per i pacchetti python senza problemi

Ho finito per importare l'attributo versione da un file separato.

Quindi il mio file "versione" di solito è

my_package/ 
    __init__.py 
    my_module1/ 
     ... 
    my_module2/ 
     ... 
    my_module3/ 
     ... 
    info/ 
     __init__.py 
     version.py 
      __version__ = '0.1.0' 

e nel più alto __init__.py ho importare l'attributo __version__ da info.version:

import __version__

in modo che si può ottenere il numero di versione via

my_package.__version__ 

Mi chiedo solo se questo è un approccio "ok", e se qualcosa parla di farlo in questo modo? Non vedo l'ora di esprimere opinioni e suggerimenti!

+5

Strettamente legato: [cosa è il modo corretto di condividere pacchetto versione con setup.py e il pacchetto?] (http://stackoverflow.com/q/17583443), che richiede l'uso di 'setuptools' invece di' distutils'. No, l'impostazione della versione in 'setup.py' non la renderà disponibile come' my_package .__ version__'. –

+0

Controllerò l'altro thread, grazie! – Sebastian

risposta

1

Non hai detto come si ottiene il numero di versione in setup.py, ma non provare a importarlo con il solito approccio import my_package. Il pacchetto non è stato installato quando si esegue setup.py!

Il mio approccio abituale consiste nel definire il numero di versione in setup.py e nel setup.py (re) generare il file di livello superiore __init__.py del pacchetto quando cambia il numero di versione. Questo è facile da fare se il file __init__.py non contiene altro codice.

+1

Sì, sembra un trucco che funzionerebbe! In questo momento, ho fondamentalmente un numero di versione definito in 'setup.py' e uno in' __init __. Py' - questo funziona bene finché non si dimentica di cambiare uno di quelli quando si aggiorna il pacchetto ...: P – Sebastian

4

Una soluzione è definire il __version__ nel file __init__.py e leggerlo dall'interno di setup.py. Ciò significa che devi solo cambiare la versione in un'unica posizione. Ho scritto una piccola funzione che farà questo:

from setuptools import setup 
import re 

def get_property(prop, project): 
    result = re.search(r'{}\s*=\s*[\'"]([^\'"]*)[\'"]'.format(prop), open(project + '/__init__.py').read()) 
    return result.group(1) 

project_name = 'YOUR PROJECT' 
setup(
    ..., 
    version = get_property('__version__', project_name), 
    ..., 
) 

è anche possibile utilizzare questo per andare a prendere le cose come __author__ o qualsiasi altra cosa definito nel __init__.py file di