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 pipreqs
i wdrożone za pomocą polecenia pip install -r /path/to/requirements.txt
), ale byłem bardzo zaskoczony, gdy zauważyłem, że requirements.txt
tak 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.
źródło
sys
lubos
czy 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.Odpowiedzi:
Czy zastanawiałeś się nad utworzeniem
setup.py
pliku? 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.
źródło
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
, condarequirments.txt
itp. 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. (googlepython 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ęść:
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.
źródło
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ć gopipenv --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 uruchomiszpipenv install -r requirements.txt
, zainstaluje wszystkie twoje pakiety. Teraz możesz zrobić,pipenv shell
aby aktywować nowy virtualenv lubpipenv run your_main_file.py
po prostu uruchomić swój projekt.Teraz spójrzmy na zawartość Twojego pliku Pip. Powinno to być coś podobnego do tego:
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 update
aktualizowanie 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 install
a 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.
źródło
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.
źródło
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:
zainstaluj py2exe: „pip install py2exe”
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.)
Uruchom: python setup.py py2exe
Używam również oprogramowania „Inno Setup” do tworzenia instalatora: tworzenie skrótów, ustawianie zmiennych środowiskowych, ikon itp.
źródło
Myślę, że możesz używać dokera z pythonem https://github.com/celery/celery/tree/master/docker
uprzejmie śledź pliki i myślę, że możesz znaleźć sposób, aby utworzyć plik dokera dla skryptów Python!
źródło
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.
tox
Lub 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.
źródło
... 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 goDam 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):
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.
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
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 :)
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.
źródło