2017-12-02 99 views
8

Załóżmy, że mam trzy skrypty. Main.py (ma wszystkie importy), 1.py (losowy skrypt), 2.py (losowy skrypt).Importowanie modułów Pythona z wybranej lokalizacji

pyinstaller -F --onedir Main.py (80mb) 
pyinstaller -F --onedir 1.py (80mb) 
pyinstaller -F --onedir 2.py (80mb) 

Spowoduje to utworzenie 3 folderów, a następnie skopiowanie plików 1.exe i 2.exe do folderu głównego ze wszystkimi zależnościami i działa poprawnie.

image

obecne są dwie kwestie:

Kwestia jest wielkość. Jeden plik redukuje to do 30 MB, jeden folder zatrzymuje go na 80mb

Co ważniejsze, exe nie mogą opuścić tego folderu. Musiałem uciekać się do używania skrótów w Pythonie.

Podążam za this, co podobno stanowi obejście tego problemu.

Moje pytanie brzmi: jak mogę odczytać import z wybranej lokalizacji za pomocą narzędzia do usuwania, aby móc przenieść pliki wykonywalne?

logicznych: kompilacji Main.py użyciu pyinstaller -F –onefile Main.py (15mb).

Utwórz folder na C:\13\ tak exe wygląda jak C:\13\Main.exe

linku wszystkie exe na C:\13? z --runtime-tmpdir PATH

Mam trudności ze znalezieniem dokumentacji na temat importu z wewnątrz exe, a nawet katalogu "one dir". Istnieje wiele sposobów na uzyskanie importu od samego początku, ale nie wiele na temat importu z wybranej lokalizacji, więc mogę uruchomić system exe w dowolnym miejscu. Co więcej, ciężko jest nawet znaleźć moduły w Pyinstallerze, aby je zdekompilować, dodając do tego zamieszania.

Może ...

pyinstaller -F --runtime-tmpdir C:\13 --onefile 2.py 

pyinstaller -F --runtime-tmpdir C:\13 --onedir 3.py 

Choć dla mnie nie jest tworzony katalog. Jak mogę uzyskać import z wybranej lokalizacji?

Innym możliwym solution:

if getattr(sys, 'frozen', False): 
     os.path.join(sys._MEIPASS, "C:\aa") 

Choć jak widać w image, to powiedzmy, że chcieliśmy pandy istnieje kilka plików do wyboru ...

+0

Dokumentacja z pyinstaller posiada szczegółowy rozdział dotyczący sposobu wielokrotność opakowania exe dzieląc te same zależności: https://pyinstaller.readthedocs.io/en/stable/spec-files.html#multipackage-bundles –

+0

@FlorentB. "Ta funkcja jest zepsuta w wydaniu PyInstaller 3.0" –

Odpowiedz

0

miałem te same problemy z PyInstaller kiedy przełączyli się do wersji 3.0 i Nuitka rozwiązali to dla mnie.

Można połączą swoje Main.py w .pyd lib pliku, a następnie utworzyć pliki wykonywalne dla 1.py i 2.py które importować wszystkie potrzebne pakiety z tego „dll”. W związku z tym można umieścić plik lib w określonej lokalizacji i odpowiednio ustawić odpowiednio PYTHONPATH przed uruchomieniem plików wykonywalnych (np. W pliku wsadowym lub bezpośrednio w konfiguracji powłoki).

+0

Użyłem Nuitki w przeszłości, a konfigurowanie jej było bardzo mylące i błędne. Spędziłem cały dzień przechodząc przez niekończący się szereg ustawionych błędów, co nie było zabawne i mało dokumentacji na temat problemów. Jeśli mógłbyś podać bardziej dokładny przewodnik, czuję, że inni mogą z tego skorzystać. Moje serce jest całkiem ustawione na Pyinstallerze, ponieważ ma wspaniałe wsparcie dla dokumentów, więc po prostu używanie "Nuitka" prawdopodobnie nie jest pomocne xD –

0

ja badali to dalej i wierzyć rozwiązań przedstawionych here być odpowiedź jestem po

Korzystanie onefile nie jest możliwe, gdyż ta funkcja jest obecnie złamane.

Aby rozwiązać mój pierwszy problem, UPX i katalog wirtualny. Na koniec wszystkie pliki w jednym katalogu. Na koniec, umieszczenie pliku exe w folderze, tak jak zrobiłem to na zdjęciu, oznacza, że ​​mam zredukowany plik.

Mogę tworzyć skróty za pomocą skryptu Pythona (jeśli nadal jest to problemem), jednak nie ma prawdziwej potrzeby i działa wszystkie exe w tym jednym folderze jest więcej niż w porządku przez mnie znalazłem. Mogą naprawić plik OneFile w przyszłości, ale jestem bardziej niż zadowolony z tego rozwiązania.

W rezultacie: Mniejszy plik.

Czy mogę uruchomić te serwery gdziekolwiek chcę na tym komputerze? Niestety, nie bez wielopakietowych pakietów, które są zepsute. Możesz utworzyć skróty, które nie są tak złe, jak myślałem. Choć mogą to naprawić w przyszłości, ale w międzyczasie to rozwiązanie jest tak dobre, jak to tylko możliwe. Jeśli jestem w błędzie, możesz mnie poprawić, ale jestem zadowolony z tego rozwiązania.

Powiązane problemy