Solidny sposób na zapewnienie innym osobom możliwości uruchamiania mojego programu python

17

Chciałbym umieścić program python na GitHub, aby inni ludzie pobrali go i uruchomili na swoich komputerach z różnymi systemami operacyjnymi. Jestem stosunkowo nowy w Pythonie, ale wykorzystałem go na tyle, aby zauważyć, że współpraca różnych wersji wszystkich zawartych modułów może być problematyczna. Właśnie odkryłem użycie requirements.txt(wygenerowane pipreqsi wdrożone za pomocą polecenia pip install -r /path/to/requirements.txt), ale byłem bardzo zaskoczony, gdy zauważyłem, że requirements.txttak naprawdę nie określa, która wersja Pythona jest używana, więc oczywiście nie jest to kompletne rozwiązanie. Moje pytanie brzmi: jaki zestaw specyfikacji / plików / czegoś innego jest potrzebny, aby zapewnić, że ktoś pobierający mój projekt będzie mógł go uruchomić przy możliwie najmniejszej liczbie problemów.

EDYCJA: Moim planem było kierować się dowolną odpowiedzią, która uzyskała najwięcej pozytywnych opinii. Ale do tej pory, po 4 odpowiedziach i 127 widokach, żadna odpowiedź nie ma nawet jednego pozytywnego wyniku. Jeśli niektóre odpowiedzi nie są dobre, warto zapoznać się z komentarzami wyjaśniającymi , dlaczego nie są one dobre.

Mick
źródło
1
w przypadku jak najmniejszej liczby problemów, czy zastanawiałeś się nad Dockerem (lub innymi rozwiązaniami opartymi na kontenerach)? docker.com
Ramzi
Re: Docker ... Właśnie to znalazłem: „deweloper może mieć pewność, że aplikacja będzie działać na dowolnym innym komputerze z systemem Linux” - ale chcę, aby działała na dowolnym systemie operacyjnym. ( opensource.com/resources/what-docker )
Mick
Zwykle masz obsługę wszystkich klasycznych systemów operacyjnych: windows ( docs.docker.com/docker-for-windows ) i mac ( docs.docker.com/docker-for-windows )
Zaccharie Ramzi
2
Odpowiedź tutaj jest wysoce kontekstualna. To jest program Python robi rzeczy, które są syslub osczy funkcje typu podproces lub bardziej matematyczne / analityczne? Ten pierwszy może się zmieniać w każdej wersji Pythona, a później może być całkowicie niezależny od wersji. Jakie biblioteki zależne? numpy i pandy wykonują niesamowitą pracę na różnych platformach, więc możesz po prostu sprawdzić, czy masz wersję min. Jaka główna wersja Pythona? Różnica między Python 2.x a 3.x z bibliotekami zależnymi staje się jeszcze trudniejsza. Jeśli napiszesz dobry kod kierujący na popularne wydanie główne, to dobry początek.
dawg
2
Jak wynika z niezliczonej liczby odpowiedzi, istnieje na to wiele sposobów. Jestem bardzo ciekawy, czy odpowiedzi nie zmieni na podstawie wiedząc co aplikacja jest. Chciałbym wierzyć, że to nie powinno mieć znaczenia, ale podejrzewam, że może. Myślę też, że to bardzo zależy od zamierzonej publiczności. Doświadczony doktor fizyki z uruchomioną aplikacją uczenia maszynowego vs Joe internet gra w warcaby.
Marcel Wilson

Odpowiedzi:

15

Czy zastanawiałeś się nad utworzeniem setup.pypliku? Jest to wygodny sposób na połączenie wszystkich twoich ... dobrze skonfigurowanych w jedną lokalizację. Więc wszystko, co musisz zrobić, to A) sklonować repozytorium i B) uruchomić, pip install .aby uruchomićsetup.py

Dyskutuje się na ten temat o stosach.

Jak również przykładowy uchwyt napisany przez faceta z prośbami.

Powinno to obejmować większość przypadków użycia. Teraz, jeśli chcesz, aby była prawdziwie rozpowszechnialna , powinieneś spróbować skonfigurować ją w PyPi , oficjalnym centrum dystrybucji.

Poza tym, jeśli pytasz, jak uczynić program „niezależnym od systemu operacyjnego”, nie ma jednego uniwersalnego rozwiązania. To zależy od tego, co robisz ze swoim kodem. Wymaga zbadania, w jaki sposób Twój kod współdziała z tymi systemami operacyjnymi itp.

Taylor Cochran
źródło
7

Istnieje wiele, wiele, wiele, wiele, wiele, wiele, wiele sposobów aby to zrobić. Omówię zasady każdego z nich, a to przypadek użycia.

1. Środowisko python

Istnieje wiele sposobów, aby to zrobić. pipenv, conda requirments.txtitp. itd.

W niektórych z nich możesz określić wersje Pythona. W przypadku innych, po prostu określ zakres wersji Pythona, z którymi współpracujesz - na przykład, jeśli używasz Pythona 3.7, jest mało prawdopodobne, aby nie obsługiwał 3.6; jest tylko jedna lub dwie niewielkie zmiany. 3.8 powinien również działać.

Inną podobną metodą jest setup.py. Są one zwykle używane do dystrybucji bibliotek - takich jak PyInstaller (inne rozwiązanie, o których wspomnę poniżej), lub numpy, wxPython lub PyQt5 itp. - do importu / wiersza poleceń. Przewodnik po pakowaniu w Pythonie jest dość przydatny i istnieje wiele samouczków. (google python setup.py tutorial) Możesz również określić wymagania w tych plikach.

2. Pojemnik

Docker jest duży. Jeśli o tym nie słyszałeś, będę zaskoczony. Szybkie google streszczenia wyjdzie z tego , co będę cytować część:

Dlaczego więc wszyscy kochają pojemniki i dokery? James Bottomley, wcześniej CTO firmy Parallels zajmującej się wirtualizacją serwerów i wiodący programista jądra Linuksa, wyjaśnił hiperwizory VM, takie jak Hyper-V, KVM i Xen, „oparte są na emulacji sprzętu wirtualnego. wymagania systemowe."

Kontenery używają jednak wspólnych systemów operacyjnych. Oznacza to, że są znacznie wydajniejsze niż hiperwizory pod względem zasobów systemowych. Zamiast wirtualizować sprzęt, kontenery spoczywają na jednej instancji Linuksa. Oznacza to, że możesz „pozostawić bezużyteczne śmieci 99,9 procent maszyn wirtualnych, pozostawiając małą, zgrabną kapsułkę zawierającą aplikację”

To powinno podsumować to dla ciebie. (Uwaga: nie potrzebujesz konkretnego systemu operacyjnego dla kontenerów).

3. Plik wykonywalny

Istnieją 2 główne narzędzia, które robią to w momencie pisania. PyInstaller i cx_Freeze. Oba są aktywnie rozwijane. Oba są open source.

Bierzesz skrypt, a narzędzie kompiluje go do kodu bajtowego, wyszukuje importy, kopiuje je i tworzy przenośne środowisko Pythona, które uruchamia skrypt w systemie docelowym bez potrzeby, aby użytkownik końcowy go pytał.

Osobiście wolę PyInstaller - jestem jednym z programistów. PyInstaller zapewnia całą swoją funkcjonalność za pomocą skryptu wiersza poleceń i obsługuje większość bibliotek, które możesz wymyślić - i jest rozszerzalny, aby obsługiwać więcej. cx_Freeze wymaga skryptu instalacyjnego.

Oba narzędzia obsługują systemy Windows, Linux, macOS i inne. PyInstaller może tworzyć pojedyncze pliki ex lub jeden pakiet folderów, podczas gdy cx_Freeze obsługuje tylko jeden pakiet folderów. PyInstaller 3.6 obsługuje Python 2.7 i 3.5-3.7 - ale 4.0 nie obsługuje Pythona 2. cx_Freeze zrezygnował z obsługi Pythona 2 od ostatniego ważnego wydania (chyba 6.0).

W każdym razie dość o funkcjach narzędzi; możesz sam na nie spojrzeć. (Zobacz https://pyinstaller.org i https://cx-freeze.readthedocs.io, aby uzyskać więcej informacji)

Korzystając z tej metody dystrybucji, zazwyczaj udostępniasz kod źródłowy w repozytorium GitHub, kilka plików exe (po jednym dla każdej platformy) gotowych do pobrania oraz instrukcje, jak zbudować kod w pliku wykonywalnym.

Legorooj
źródło
1

Najlepszym narzędziem, jakiego do tej pory użyłem, jest Pipenv . Deweloper, nie tylko ujednolica i upraszcza cały przepływ pracy pip + virtualenv, ale także gwarantuje, że dokładne wersje wszystkich zależności (w tym samego Pythona) są spełnione, gdy inne osoby prowadzą z nim projekt.

Strona internetowa projektu całkiem dobrze wyjaśnia, jak korzystać z tego narzędzia, ale ze względu na kompletność przedstawię tutaj krótkie wyjaśnienie.

Po zainstalowaniu Pipenv (na przykład przez uruchomienie pip install --user pipenv) możesz przejść do katalogu swojego projektu i uruchomić go pipenv --python 3.7, więc Pipenv utworzy nową wirtualną wersję dla twojego projektu, utworzy plik Pipfile i plik Pipfile.lock (więcej na ten temat później) . Jeśli pójdziesz dalej i uruchomisz pipenv install -r requirements.txt, zainstaluje wszystkie twoje pakiety. Teraz możesz zrobić, pipenv shellaby aktywować nowy virtualenv lub pipenv run your_main_file.pypo prostu uruchomić swój projekt.

Teraz spójrzmy na zawartość Twojego pliku Pip. Powinno to być coś podobnego do tego:

[packages]
Django = "*"
djangorestframework = "*"
iso8601 = "*"
graypy = "*"
whitenoise = "*"

[requires]
python_version = "3.7"

Ten plik ma czytelne dla człowieka specyfikacje dla zależności twojego projektu (zauważ, że określa również wersję Pythona). Jeśli Twoje wymagania.txt miały przypięte wersje, twój Pipfile też może je mieć, ale możesz bezpiecznie je wypisać, ponieważ dokładne wersje są przechowywane w Pipfile.lock. Teraz możesz uruchamiać takie rzeczy jak pipenv updateaktualizowanie swoich zależności i nie zapomnij zatwierdzić Pipfile i Pipfile.lock do swojego VCS.

Gdy ludzie sklonują Twój projekt, wystarczy, że uruchomią się, pipenv installa Pipenv zajmie się resztą (może nawet zainstalować dla nich poprawną wersję Pythona).

Mam nadzieję, że było to przydatne. Nie jestem w żaden sposób związany z Pipenvem, chciałem tylko udostępnić to niesamowite narzędzie.

gflorio
źródło
1

Jeśli Twój program nie dotyczy GUI lub ma internetowy interfejs GUI, możesz udostępnić kod za pomocą Google Colaboratory.

https://colab.research.google.com/

Każdy może go uruchomić w tym samym środowisku. Nie ma potrzeby instalacji.

korakot
źródło
1

Jeśli konwersja wszystkich skryptów Pythona w jeden plik wykonywalny może ci pomóc, moja odpowiedź poniżej pomoże ...

Od 3 lat tworzę dużą aplikację komputerową wyłącznie w języku Python. Jest to narzędzie oparte na graficznym interfejsie użytkownika, zbudowane na bazie biblioteki pyqt (powiązania Pythona ze strukturą QT C ++).

Obecnie używam biblioteki pakowania „ py2exe ”: jest to rozszerzenie distutils, które pozwala budować samodzielne programy wykonywalne Windows (32-bitowe i 64-bitowe) ze skryptów Python; wszystko co musisz zrobić, to:

  1. zainstaluj py2exe: „pip install py2exe”

  2. Utwórz skrypt setup.py: służy do określania zawartości końcowego pliku EXE (nazwa, ikona, autor, pliki danych, biblioteki współdzielone itp.)

  3. Uruchom: python setup.py py2exe

Używam również oprogramowania „Inno Setup” do tworzenia instalatora: tworzenie skrótów, ustawianie zmiennych środowiskowych, ikon itp.

Rida Shamasneh
źródło
py2exe nie był aktualizowany od lat. Nie mogę znaleźć żadnej ostatniej aktywności. Zakładam, że to nie jest utrzymane. (Ponadto obsługuje tylko Python <3.4., Co oznacza, że ​​obsługuje tylko przestarzałe wersje Pythona).
Legorooj
-1

Ponieważ nie ma go w innych odpowiedziach, chciałbym dodać jeden zupełnie inny aspekt:

Testów jednostkowych. Lub ogólnie testy.

Zwykle dobrze jest mieć jedną znaną dobrą konfigurację. W zależności od zależności programu może być konieczne przetestowanie różnych kombinacji pakietów. Możesz to zrobić w sposób zautomatyzowany, np. toxLub jako część potoku CI / CD.

Nie ma ogólnej reguły dotyczącej tego, jaką kombinację pakietów należy przetestować, ale zwykle głównym problemem jest kompatybilność python2 / 3. Jeśli masz silne zależności od pakietów z głównymi różnicami wersji, możesz rozważyć przetestowanie tych różnych wersji.

Dschoni
źródło
To bardzo ważny aspekt tworzenia oprogramowania. Jednak to całkowicie nie odpowiada na pytanie . W jaki sposób testy jednostkowe pomagają w dystrybucji programu?
Legorooj
IMHO, OP nie pyta konkretnie o dystrybucję. Pyta o sposoby, aby upewnić się, że inni ludzie będą mogli uruchomić jego program. Myślę, że testowanie jednostkowe może w tym pomóc, ponieważ ludzie mogą być ograniczeni w zestawie pakietów, których można używać. Zasadniczo pytanie dystrybucyjne jest ważne (i udzielono na nie odpowiedzi tutaj), ale myślę, że w prawdziwym scenariuszu nie możemy polegać na stworzeniu całego venv tylko dla jednego pakietu - musi być kompatybilny z co najmniej niektórymi standardowymi konfiguracjami.
Dschoni
Nie podważam, że testowanie jednostkowe jest cenne dla upewnienia się, że działa poprawnie, ale OP zapytał, jak udostępnić kod w sposób „łatwy w instalacji”. Dlatego uważam, że jest to nieprawidłowa odpowiedź na to konkretne pytanie.
Legorooj
Nadal uważam, że pytanie dotyczy nie tylko dystrybucji. Dlatego dodałem tę odpowiedź. Jeśli tworzysz np. W systemie Windows, testowanie na Uniksie jest niezbędne, jeśli chcesz się upewnić, że działa przed dystrybucją.
Dschoni
Z ciekawości, czym różni się od tego, co właśnie powiedziałem? ... making sure it runs correctly ...? Testowanie jest istotną częścią upewniając się, że działa prawidłowo, więc to jest istotnym elementem przygotowania do ich dystrybucji, ale nie jest to jeszcze nic wspólnego z faktycznie rozprowadzania go
Legorooj
-1

Dam ci bardzo krótkie podsumowanie niektórych istniejących dostępnych rozwiązań, jeśli chodzi o opakowania Pythona, z których możesz wybierać (wiedza to potęga):

  1. Postępuj zgodnie ze wskazówkami zawartymi w Strukturyzowaniu twojego projektu , te konwencje są powszechnie akceptowane przez społeczność python i jest to zwykle dobry punkt wyjścia, gdy nowi użytkownicy zaczynają pisać w Pythonie. Postępując zgodnie z tymi wskazówkami, pythoniści oglądający twój projekt / źródło w github lub w innych podobnych miejscach będą od razu wiedzieli, jak go zainstalować. Również przesłanie projektu do pypi, a także dodanie CI zgodnie z tymi zasadami będzie bezbolesne.

  2. Gdy projekt jest właściwie skonstruowany zgodnie ze standardowymi konwencjami, następnym krokiem może być użycie niektórych dostępnych zamrażarek , na wypadek gdybyś chciał wysłać użytkownikom końcowym pakiet, który mogą zainstalować bez zmuszania ich do zainstalowania Pythona na swoim komputerze. maszyny Pamiętaj jednak, że te narzędzia nie zapewniają żadnej ochrony kodu ... inaczej mówiąc, wyodrębnienie oryginalnego kodu python z końcowych artefaktów byłoby we wszystkich przypadkach trywialne

  3. Jeśli nadal chcesz wysłać swój projekt do użytkowników bez zmuszania ich do zainstalowania jakiejkolwiek zależności deweloperów , a także dbasz o ochronę kodu, więc nie chcesz brać pod uwagę żadnej z istniejących zamrażarek, możesz użyć narzędzi takich jak nuitka , shedskin , cython lub podobne. Zwykle odwracanie kodu z artefaktów wytwarzanych przez te narzędzia wcale nie jest trywialne ... Z drugiej strony ochrona przed pękaniem to inna sprawa i chyba że nie zapewnisz fizycznego pliku binarnego użytkownikowi końcowemu, nie możesz wiele zrobić o tym innym niż spowolnienie ich :)

  4. Ponadto w przypadku konieczności użycia języków zewnętrznych w projekcie Python innym klasycznym linkiem, który przychodzi na myśl, byłoby https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages , dodając systemy kompilacji takich narzędzi do CI, wykonując następujące czynności reguły 1 byłyby dość łatwe.

To powiedziawszy, sugeruję trzymać się punktu 1, ponieważ wiem, że będzie więcej niż wystarczająco dobry, aby zacząć, a także, że ten konkretny punkt powinien obejmować wiele istniejących przypadków użycia dla „standardowych” projektów Pythona.

Chociaż nie jest to zamierzony pełny przewodnik, postępując zgodnie z tymi, będziesz mógł szybko opublikować swój projekt w języku Python.

BPL
źródło