2010-11-11 5 views
19

Proszę pokazać proste i aktualne standardowy sposób, aby utworzyć pakiet Pythona do Pythona 2.xJak utworzyć pakiet Pythona 2.x - prosta sprawa

wolałbym używać pip dla instalacji pakietu później.

Pakiet powinien zawierać jedną klasę:

class hello: 
    def greet(self): 
    print "hello" 

One powinny być w stanie wykonać następujące później:

pip install my_package-0.1.1.... 

a następnie użycie go:

from my_package import hello 

h = hello.hello() 
h.greet() 

Co ja Pytam o to:

  • układ katalogów i plików
  • Zawartość plików
  • polecenie, aby utworzyć podziałowi plik pakietu
  • polecenie, aby zainstalować pakiet z podziałowi pliku pakietu (używając najlepiej PIP)

Nie jest kilka porad, które znalazłem, ale nadal nie jestem pewien jak ten prosty i zdemontowany przypadek (bez zagnieżdżonych pakietów, usunięcie wszystkich plików i funkcji, które można pominąć w najprostszym przypadku) byłby obsługiwany i jaki jest nowoczesny sposób aby to zrobić.

Chciałbym, aby to pytanie zostało wpisane do społecznościowego stanu wiki, więc nie otrzymasz żadnych punktów, a dam wystarczająco dużo czasu i zaznaczę odpowiedź zaakceptowaną po kilku dniach, także biorąc pod uwagę głosy i komentarze.

Edit:

Mam uruchomiony pierwszy przykład, że chcę podzielić użyłem odpowiedź Marius Gedminas za nim. Nie zawiera wszystkiego, co powinno tam być, ale działa, dzięki czemu może demonstrować rdzeń procesu technicznego. Aby dodać więcej niezbędnych części, przeczytaj odpowiedź Mariusza poniżej.

Struktura katalogów:

MyProject/ 
    setup.py 
    my_package.py 
    README.txt 
    MANIFEST.in 

setup.py:

from setuptools.import setup 
setup(name='MyProject', 
     version='0.1', 
     py_modules=['my_package']) 

my_package.py:

class hello: 
    def greet(self): 
    print "hello" 

MANIFEST.in:

include *.txt 

Aby utworzyć pakiet z tego folderu, przejdź do folderu i uruchom MyProject:

$ python setup.py sdist 

Spowoduje to utworzenie pliku MyProject-0.1.tar.gz w podfolderze dist/. Skopiuj ten plik do folderu na komputerze docelowym.

na komputerze docelowym uruchomić to polecenie w folderze zawierającym MyProject-0.1.tar.gz:

sudo pip install MyProject-0.1.tar.gz 

To może być konieczne, aby wylogować się i ponownie zalogować w komputerze docelowym teraz, więc będzie można znaleźć pakiet. Następnie można przetestować pakiet na komputerze docelowym, stosując powłokę Pythona:

$ python 
>>> import my_package 
>>> h = my_package.hello() 
>>> h.greet() 
hello 
>>> 

Raz działa to proszę pamiętać, aby dodać inne niezbędne treści, patrz odpowiedź Marius jest poniżej.

+0

Punkt to pytanie jest wybrać nowoczesne podejście, a następnie usunąć prawie wszystko, co można rozebrać, aby nadal działało. – mit

Odpowiedz

32

start prosty

Najprostszy pakiet jeden plik:

MyProject/ 
    setup.py 
    my_package.py 

Najprostszy setup.py:

from setuptools import setup 
setup(name='MyProject', 
     version='0.1', 
     author='Your Name', 
     author_email='[email protected]', 
     license='MIT', 
     description='Example package that says hello', 
     py_modules=['my_package']) 

Włączenie dodatkowych plików w pakiecie

Następny powinieneś dodać README:

MyProject/ 
    MANIFEST.in 
    README.rst 
    setup.py 
    my_package.py 

zanotować nowy plik - MANIFEST.in.To określa, które non-python pliki powinny być zawarte w dystrybucji źródłowej:

include *.rst 

osób powie: „Och, pomiń manifest, wystarczy dodać pliki do kontroli źródła, setuptools znajdzie je”. Zignoruj ​​tę radę, jest zbyt podatna na błędy.

Dokonywanie strony PyPI przydatnych

jest to przydatne, aby README.rst dostępny dla ludzi zobaczyć w Internecie, na indeksie pakiet Pythona. Tak zmienić setup.py zrobić

from setuptools import setup 
with open('README.rst') as f: 
    readme = f.read() 
setup(name='MyProject', 
     ... 
     description='Example package that says hello', 
     long_description=readme, 
     ...) 

Zastosowanie ReStructuredText znaczników dla ładniejszych stron. Użyj tej metody, aby wcześnie wykrywać błędy ReStructuredText.

Więcej niż jeden moduł Pythona w pakiecie

Jeden plik nie będzie wystarczająco szybko, więc go zmienić na opakowaniu (mylące ostrzeżenia terminologii: Pakiet python jak w katalogu z __init__ py, a nie jak w wypłacie samowystarczalny archiwum):

MyProject/ 
    MANIFEST.in 
    README.rst 
    setup.py 
    my_package/ 
     __init__.py 
     some_module.py 

i zmienić setup.py do

from setuptools import setup, find_packages 
with open('README.rst') as f: 
    readme = f.read() 
setup(name='MyProject', 
     version='0.2', 
     author='Your Name', 
     author_email='[email protected]', 
     license='MIT', 
     description='Example package that says hello', 
     long_description=readme, 
     packages=find_packages()) 

Zwalnianie do publicznej

Get a PyPI account - wystarczy zrobić to tylko raz.

Aby dokonać uwolnienia, upewnij się, że numer wersji w setup.py jest poprawna, a następnie uruchomić

python setup.py sdist register upload 

to wszystko.

mówić ludziom, aby go zainstalować

Niech

pip install MyProject 

(tej samej nazwie został określony w setup.py jako name argument setup())

+2

Zgadzam się z pytaniem o "najprostszy" tutaj. Chociaż absolutnie zgadzam się, że ważne jest, aby zacząć proste, w końcu musisz się rozwijać. Kiedy tak się stanie, ścieżka wzrostu powinna być jasna. –

+0

Naprawdę niesamowite, wielkie dzięki! – mit

+3

Wydaje mi się, że znalazłeś dobrą równowagę między prostymi i zawierającymi najważniejsze dodatki. – mit

4

Poniżej jest kopiowany z Distutils Tutorial.

układ pliku:

top 
|-- package 
| |-- __init__.py 
| |-- module.py 
| `-- things 
|  |-- cross.png 
|  |-- fplogo.png 
|  `-- tick.png 
|-- runner 
|-- MANIFEST.in 
|-- README 
`-- setup.py 

Aby paczkę instalacyjną, wystarczy uruchomić:

python setup.py sdist 

Aby zainstalować pakiet, należy pip lub easy_install:

pip install my_package-1.2.3.tar.bz2 

lub

easy_install my_package-1.2.3.tar.bz2 

Ponadto, można go przesłać do PyPI najpierw zarejestrować go:

python setup.py register 

następnie przesłać archiwum źródłowe

python setup.py sdist upload 

można przesyłać jaj binarne, jak również (choć nie jest to konieczne):

python setup.py bdist_egg upload 

Następnie ludzie mogą zainstalować to tak:

pip install my_package==1.2.3 

lub

easy_install my_package==1.2.3 
+0

@mit ah dobrze; jeśli chcesz zachować absolutne minimum, '__import __ ('setuptools'). setup (name = 'myapp')' jest wystarczający :) –

+0

Przesyłanie bdist_eggs nie jest tylko niepotrzebne, ale może być aktywnie szkodliwe. Zrób to tylko, jeśli budujesz pakiet dla systemu Windows, który wymaga kompilatora C do zainstalowania. –

+0

@Marius Gedminas, czy możesz podać swoje źródło na szkodliwość jaj? Nie używam ich zbyt wiele, ale mogą być użyteczne dla osób bez zainstalowanych bibliotek deweloperskich (jeśli pakiet ma rozszerzenia C). Jeśli chodzi o okna, 'bdist_wininst' może działać lepiej, ponieważ działa również jak jajko (' easy_install' i 'pip' może je rozpakować), ale pozwala także użytkownikom instalować się za pomocą interfejsu GUI. –