Jak sprawić, by skrypt w Pythonie działał jako niezależny plik wykonywalny bez ŻADNEJ zależności?

706

Buduję aplikację Python i nie chcę zmuszać moich klientów do instalowania Pythona i modułów.

Czy jest więc sposób na skompilowanie skryptu Python, aby był samodzielnym plikiem wykonywalnym?

Jeff
źródło
307
Część pytania: „Nie chcę zmuszać moich klientów do instalowania Pythona i modułów”. Nie oznacza to, że klienci nie mogą tego zrobić, mówi, że programista nie chce, aby tego wymagali. Dyskusja na ten temat nie ma sensu, ponieważ klienci nie czytają SO, aby mówić za siebie. Nie chciałbym instalować środowiska programistycznego Flash, aby oglądać YouTube, ani środowiska programistycznego C, aby grać w Sudoku, ani środowiska programistycznego Python, aby uruchomić wersję Angry Birds napisaną w Pythonie. Po to są środowiska redystrybucyjne.
Dave

Odpowiedzi:

243

Możesz użyć py2exe jako już odebranego i użyć cytonu do konwersji .pyplików kluczy, plików .pycskompilowanych w języku C, takich jak .dllw systemie Windows i .soLinux, znacznie trudniej przywrócić pliki zwykłe .pyoi .pycpliki (a także zwiększyć wydajność!)

neurino
źródło
1
Dziękuję za odpowiedź. Rozważyłem Cython, ale wydaje się, że nadal potrzebuje Pythona, aby uruchomić skompilowany plik wykonywalny. Masz na myśli kompilowanie skryptu do .pyc przy użyciu Cython? (Nie wiedziałem, czy Cython ma taką funkcję)
Jeff
9
Mam na myśli dwa problemy : zamknięte źródło i brak dep-deps. Dla zamkniętego źródła skompiluj swój ważny kod w C libs używając Cython. Dla bez-deps użyj py2exe i stwórz plik wykonywalny z plikami .pyd (skompilowanymi w języku cython).
neurino
7
Co zrobiłbyś z bibliotekami (numpy, scipy, matplotlib)? Na przykład, w jaki sposób klienci mogliby korzystać z funkcji ginput () w matplotlib z pliku wykonywalnego, bez konieczności instalowania go na swoim komputerze.
chimpsarehungry
@chimpsarehungry co z łączeniem statycznym?
Braden Best
11
Wydaje się, że ostatnie wydanie miało miejsce w 2008 r.
Zitrax,
302

Za pomocą PyInstaller można spakować programy w języku Python jako samodzielne pliki wykonywalne. Działa w systemach Windows, Linux i Mac.

Szybki start PyInstaller

Zainstaluj PyInstaller z PyPI:

pip install pyinstaller

Przejdź do katalogu programu i uruchom:

pyinstaller yourprogram.py

Spowoduje to wygenerowanie pakietu w podkatalogu o nazwie dist.

Bardziej szczegółowy przewodnik znajduje się w instrukcji .

Rumple Stiltskin
źródło
10
Warto zauważyć, że pyinstaller może skompilować się do jednego pliku .exe. Również na którym systemie operacyjnym jest uruchamiany, sprawia, że jest wykonywalny, tj. .Exe, gdy jest uruchamiany w systemie Windows
Richard de Wit
2
@ ItayMoav-Malimovka Pracują przy wsparciu Python 3. Zobacz github.com/pyinstaller/pyinstaller/tree/python3 .
PhoneixS,
3
Jak powiedział @GeenHenk, jeśli „kompilujesz” w systemie Windows, tworzy on exe, miej na uwadze, że nie możesz kompilować dla systemu Windows (zrobić exe) w systemie Linux lub wykonać plik wykonywalny systemu Linux w systemie Windows. Możesz ustawić plik wykonywalny tylko na uruchomionej platformie. (W Linuksie możesz użyć wina, aby oszukać)
PhoneixS,
14
korzystanie z „pyinstaller” jest znacznie łatwiejsze niż „py2exe”. Dba o wszystkie zależności, w tym numpy, pandy, cokolwiek i daje jeden plik wykonywalny na działającej platformie!
aks
12
Wygląda na to, czego dokładnie szukałem. A teraz obsługuje Python 3! Dzięki :)
Daniel Gruszczyk
83

Możesz zbadać Nuitkę . Pobiera kod źródłowy Pythona i konwertuje go na wywołania API C ++. Następnie kompiluje się w wykonywalny plik binarny (ELF w systemie Linux). Istnieje już od kilku lat i obsługuje szeroką gamę wersji Pythona.

Prawdopodobnie uzyskasz także poprawę wydajności, jeśli go użyjesz. Zalecana.

cdarke
źródło
5
Nuitka to niesamowite narzędzie. Nie musisz go używać. Wskazałbym tylko jedną rzecz - nie ogranicza się tylko do Linuksa - jest wieloplatformowy - kolejny powód, dla którego warto go używać.
sjaustirni
5
Nuitka działa na Pythonie 2.6, 2.7, 3.2, 3.3 i 3.4 i jest wieloplatformowy: (Linux, FreeBSD, NetBSD, MacOS X i Windows (32/64 bity). Inne mogą również działać. Architektury: x86, x86_64 (amd64) i uzbrojenie. Inne architektury mogą również działać od
Jonathan Hartley
Nie jest obsługiwany w najnowszej wersji 3.6 .. i jest koszmarem do skonfigurowania w
systemie
Działa jak urok w macOS High Sierra + Python 3.5.2. Dziękuję Ci!
Anthony L.
Czy tworzy to samodzielny plik wykonywalny?
głosy
31

Chciałbym skompilować przydatne informacje na temat tworzenia samodzielnych plików w systemie Windows za pomocą Pythona 2.7.

Użyłem py2exe i działa, ale miałem pewne problemy.

Ten ostatni powód skłonił mnie do wypróbowania PyInstaller http://www.pyinstaller.org/ .

Moim zdaniem jest znacznie lepiej, ponieważ:

  • Jest łatwiejszy w użyciu.

Sugeruję na przykład utworzenie pliku .bat z następującymi wierszami (pyinstaller.exe musi znajdować się w ścieżce Windows):

pyinstaller.exe --onefile MyCode.py

Myślę więc, że przynajmniej dla Pythona 2.7 lepszą i prostszą opcją jest PyInstaller.

Diego
źródło
3
--onefileFlaga nie pomoże Ci zrobić to przenośny na Windows, ponieważ nadal wykonywalny chce połączenia z api-ms-win-crt-runtime-l1-1-0.dllbiblioteki (lub / i innych), które muszą być zainstalowane przez vcredistpakiet. Tak więc zależność nadal istnieje i musi zostać zainstalowana przed uruchomieniem.
Andry,
27

Tak, możliwe jest skompilowanie skryptów Python w samodzielny plik wykonywalny.

PyInstaller może służyć do konwertowania programów Python na samodzielne pliki wykonywalne w systemach Windows , Linux , Mac OS X , FreeBSD , Solaris i AIX . Jest to jeden z zalecanych konwerterów.

py2exe konwertuje skrypty Pythona na pliki wykonywalne tylko na platformie Windows.

Cython jest statycznym kompilatorem zarówno języka programowania Python, jak i rozszerzonego języka programowania Cython.

fury.slay
źródło
2
Dzięki za to. Używałem py2exe i nie mogłem w ogóle sprawić, by ikony z nim działały. PyInstaller pracował po raz pierwszy i wygląda świetnie!
Chud37
Czy mogę utworzyć samodzielny plik wykonywalny z systemu Windows dla systemu Linux i macOS? Czy powinienem zainstalować Linux i macOS na VirtualBox? Nie mam wystarczającej ilości wolnego miejsca na laptopie.
8Observer8
1
Odpowiedź na moje pytanie znalazłem w dokumentacji tutaj: pyinstaller.readthedocs.io/en/stable/…
8Observer8
26

Trzecia opcja to cx_Freezewieloplatformowość.

Katriel
źródło
1
Oto jesteśmy w lutym 2019 r. I cx_Freezeod końca 2017 r. Nie ma żadnych wymienionych wersji na pypi. Czy ten projekt został porzucony?
user9074332
17

może ci się podobać py2exe . znajdziesz tam również informacje o robieniu tego na Linuksie

użytkownik237419
źródło
2
Ale musisz dać temu pakietowi wszystkie opcje.
Jakob Bowyer
14

Użyj py2exe .... użyj poniższych plików konfiguracji:

 from distutils.core import setup
 import py2exe

 from distutils.filelist import findall
 import matplotlib

 setup(
       console=['PlotMemInfo.py'],

       options={
                'py2exe': {
                'packages' : ['matplotlib'],
            'dll_excludes': ['libgdk-win32-2.0-0.dll',
                                 'libgobject-2.0-0.dll',
                 'libgdk_pixbuf-2.0-0.dll']
                          }
                },
       data_files = matplotlib.get_py2exe_datafiles()
     )
Anand
źródło
Zrobiłem to i utworzyłem plik python27.dll i nadal jest wymagany. Po przeniesieniu pliku .exe z folderu zawierającego plik python27.dll plik .exe nie działa.
mjwrazor
Czy możesz pokazać taki skrypt dla systemu Linux i macOS? Chcę utworzyć autonomiczne pliki wykonywalne z systemu Windows dla systemu Linux i macOS.
8Observer8
13

Lubię pyinstaller - szczególnie wariant „okienkowy”:

pyinstaller --onefile --windowed myscript.py

Stworzy jeden plik * .exe w folderze dist /.

cslotty
źródło
11

Polecam również pyinstaller dla lepszej kompatybilności wstecznej, takiej jak python 2.3 - 2.7.
dla py2exe musisz mieć Python 2.6

Yantaq
źródło
pyinstaller ma problemy z importowaniem. Na przykład: w moim przypadku jestem w tym katalogu DIR ~ / Documents / python101 / oraz ex50_pycomp.py i ex50.py są w tym katalogu. ex50_pycomp.py importowanie ex50.py. Korzystam z pyinstaller ex50_pycomp.py i widzę, że wszystkie są zgodne, wyprodukowane dist. Wszystko dobrze, prawda? I cd do dist / ex50_pycomp / i uruchomić ex50_pycomp to działa. Po umieszczeniu tego ex50_pycom w maszynie wirtualnej pojawia się komunikat o błędzie importu, aw innym polu linuksa pojawia się komunikat „-bash: ./ex_50_pycom: nie można wykonać pliku binarnego: błąd formatu wykonania”
powered_spider
prob1: Korzystałem z python2.7, ale pyinstaller rozmawiał z python3 python3 setup.py build python3 setup.py install twój python3 otrzyma wszystkie pkg_resources prob 3: jeśli użycie sys_path staje się problemem, więc podaj swoją ścieżkę jak ten pyinstaller - ukryty - import = pkg_resources --onefile file.py --path = moja_path rw-rw-r-- my_path: python3's dist folder pyinstaller --hidden-import = pkg_resources --onefile file.py --path = / usr / local / lib /python3.5/dist-packages/my_code_lib-0+untagged.8.gd264bd5.dirty-py3.5.egg/my_folder -rw-rw-r--
powered_spider
8

W przypadku skryptów Python 3.2 jedynym wyborem jest Cxfreeze. Zbuduj go ze źródeł, inaczej nie będzie działać.

W przypadku python 2.x sugeruję pyinstaller, ponieważ może on spakować program python w jednym pliku wykonywalnym, w przeciwieństwie do CxFreeze, który wypisuje również biblioteki.

ravi.chunduru
źródło
6

py2exe utworzy żądany plik exe, ale musisz mieć tę samą wersję MSVCR90.dll na komputerze, na którym będziesz używać nowego exe. Aby uzyskać więcej informacji, zobacz http://www.py2exe.org/index.cgi/Tutorial .

Belial
źródło
6

Listę narzędzi do dystrybucji można znaleźć na stronie @ https://wiki.python.org/moin/DistributionUtilities .

Korzystam z bbfreeze i działał bardzo dobrze (jeszcze nie ma wsparcia dla Pythona 3).

Joe
źródło
stackoverflow.com/questions/33683133/ ... Używam bardzo ładnego pakietu bbfreeze.
user914425,
Czy dba o zależności i instaluje odpowiednie moduły py?
Volatil3
@ Volatil3 Tak, wszystkie zależności są załatwione. WRT do instalacji modułów w systemie hosta - istnieją różne rodzaje kompilacji. Bbfreeze skompiluje wszystko do wielu .soplików lub skopiuje pliki .egg bezpośrednio i wszystkie one będą obecne w jednym katalogu (lub jako pojedynczy plik). Nie wymaga instalacji.
Joe
6
pyinstaller yourfile.py -F --onefile

Spowoduje to utworzenie samodzielnego pliku EXE w systemie Windows WAŻNA UWAGA: Plik exe zostanie wygenerowany w folderze o nazwie „dist”

możesz zainstalować pyinstaller za pomocą pip install PyInstaller

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

ShadyMBA
źródło
4

Nie do końca pakiet kodu python, ale teraz jest też zrzędliwy z Google, który transponuje kod do Go. Nie obsługuje interfejsu API w Pythonie, więc może nie działać dla wszystkich projektów.

freeformz
źródło
4

Korzystając z pyinstaller, znalazłem lepszą metodę, używając skrótu do .exe, a nie tworzenia --onefile. W każdym razie prawdopodobnie są jakieś pliki danych, a jeśli korzystasz z aplikacji opartej na witrynie, twój program zależy również od plików HTML, JS, CSS. Nie ma sensu przenosić tych plików gdzieś… zamiast tego co, jeśli przesuniemy ścieżkę roboczą w górę.

Utwórz skrót do pliku exe, przesuń go u góry i ustaw ścieżki docelowe i początkowe, jak określono, aby ścieżki względne były w folderze dist \: Target: %windir%\system32\cmd.exe /c start dist\web_wrapper\web_wrapper.exe Start in: "%windir%\system32\cmd.exe /c start dist\web_wrapper\" Można zmienić nazwę skrótu na dowolną, zmieniając nazwę na „GTFS-Manager”
Teraz, kiedy podwoję -kliknij skrót, to tak, jakbym uruchomił plik w Pythonie! Znalazłem to podejście lepiej niż to, --onefileponieważ:

  1. W przypadku onefile występuje problem z brakiem pliku .dll dla systemu Windows 7, który wymaga wcześniejszej instalacji itp. Ziewanie. Przy zwykłej kompilacji z wieloma plikami nie ma takich problemów.
  2. Wszystkie pliki, których używa mój skrypt Pythona (wdraża serwer sieciowy Tornado i potrzebuje plików, żeby je tam znaleźć!), Nie trzeba ich nigdzie przenosić: po prostu tworzę skrót na górze.
  3. Właściwie mogę używać tego samego folderu w Ubuntu (uruchom python3 myfile.py) i Windows (kliknij dwukrotnie skrót).
  4. Nie muszę się przejmować zbyt skomplikowanym włamaniem do pliku .spec, aby dołączyć pliki danych itp.

Och, pamiętaj, aby usunąć folder kompilacji po kompilacji, oszczędza na rozmiarze.

Nikhil VJ
źródło
Cześć, właśnie aktualizuję. Postanowiłem zrezygnować z kompresji UPX i w końcu przejść na --onefile. Musiałem wybrać jeden, ponieważ UPX ma obecnie błąd w kompresji określonej biblioteki DLL.
Nikhil VJ
3

Użyj Cython, aby przekonwertować na c, skompilować i połączyć z gcc. Innym może być uczynienie podstawowych funkcji c (tymi, które chcesz utrudnić do odwrócenia), skompilowanie ich i użycie Python Boost do zaimportowania skompilowanego kodu (a ponadto masz znacznie szybsze wykonanie kodu). następnie użyj dowolnego narzędzia wymienionego do dystrybucji.

F.Moure
źródło
1

Powiedziano mi, że PyRun, https://www.egenix.com/products/python/PyRun/ , jest również opcją.

Kraig Brockschmidt - MSFT
źródło
5
Link do rozwiązania jest mile widziany, ale upewnij się, że Twoja odpowiedź jest przydatna bez niego: dodaj kontekst wokół linku, aby inni użytkownicy mieli pojęcie, co to jest i dlaczego tam jest, a następnie zacytuj najbardziej odpowiednią część strony, którą „ ponowne linkowanie na wypadek, gdyby strona docelowa była niedostępna. Odpowiedzi, które są niewiele więcej niż link, mogą zostać usunięte.
Petter Friberg
Ta opcja obecnie nie obsługuje systemu Windows.
Bob