2013-07-22 6 views
12

Po przeczytaniu dokumentacji Pythona (http://www.python.org/dev/peps/pep-0396/) byłem bardziej zdezorientowany niż wcześniej, jak odpowiednio ustawić atrybut __version__ dla paczek. Wspomniano o umieszczeniu ich w pliku setup.py, co wprowadza mnie w zakłopotanie: nie byłby dostępny jako my_package.__version__, prawda?Tworzenie atrybutu __version__ dla pakietów Pythona bez kłopotów

Skończyłem, aby zaimportować atrybut wersji z oddzielnego pliku.

Więc moja "wersja" plik jest zazwyczaj

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

iw najwyższym __init__.py importować atrybut __version__ z info.version:

import __version__

tak, że można uzyskać numer wersji poprzez

my_package.__version__ 

Zastanawiam się tylko, czy jest to podejście "w porządku", a jeśli coś przemawia przeciwko robieniu tego w ten sposób? Z niecierpliwością czekam na Wasze opinie i sugestie!

+5

Ściśle związane: [Co to jest poprawny sposób udostępnić pakiet wersja z setup.py i pakietem?] (http://stackoverflow.com/q/17583443), która wymaga użycia 'setuptools' zamiast' distutils'. Nie, ustawienie wersji w 'setup.py' nie spowoduje udostępnienia jej jako' my_package .__ version__'. –

+0

Sprawdzę drugi wątek, dziękuję! – Sebastian

Odpowiedz

1

Nie podano, w jaki sposób można uzyskać numer wersji w pliku setup.py, ale nie należy go importować zgodnie ze zwykłym podejściem import my_package. Pakiet nie został zainstalowany po uruchomieniu programu setup.py!

Moim zwyczajnym podejściem jest zdefiniowanie numeru wersji w pliku setup.py i skonfigurowanie pliku konfiguracyjnego (na wypadek) zmiany numeru wersji na plik __init__.py. Jest to łatwe do zrobienia, jeśli plik __init__.py nie zawiera żadnego innego kodu.

+1

Tak, to brzmi jak włamanie, które zadziała! W tej chwili mam zasadniczo numer wersji zdefiniowany w 'setup.py' i jeden w' __init __. Py' - działa to dobrze, dopóki nie zapomnisz zmienić jednego z nich podczas aktualizacji pakietu ...: P – Sebastian

4

Jednym z rozwiązań jest zdefiniowanie __version__ w pliku i odczytanie go z poziomu pliku setup.py. Oznacza to, że musisz zmienić wersję tylko w jednym miejscu. Pisałem niewielką funkcję, która będzie to zrobić:

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), 
    ..., 
) 

można również wykorzystać do pobierania rzeczy jak __author__ lub cokolwiek innego zdefiniowanego w pliku __init__.py

Powiązane problemy