2012-01-25 17 views
16

Mam prosty skrypt Pythona, który importuje różne inne moduły, które napisałem (i tak dalej). Ze względu na moje środowisko, moja PYTHONPATH jest dość długa. Używam również Pythona 2.4.Jak zbudować pojedynczy plik Pythona z wielu skryptów?

Co muszę zrobić, to w jakiś sposób spakować mój skrypt i wszystkie zależności, które nie są częścią standardowego pythona, dzięki czemu mogę wysłać pojedynczy plik do innego systemu, w którym chcę go wykonać. Wiem, że docelowa wersja Pythona jest taka sama, ale jest na Linuksie, gdzie jestem w systemie Windows. W przeciwnym razie użyłbym py2exe.

Idealnie chciałbym wysłać plik .py, który w jakiś sposób zawiera wszystkie wymagane moduły, ale zdecydowałbym się na automatyczne budowanie suwaka, który mogę rozpakować, z wymaganymi modułami w jednym katalogu.

Przyjrzałem się różnym rozwiązaniom w zakresie opakowań, ale wydaje mi się, że nie znalazłem odpowiedniego sposobu na zrobienie tego. Czy coś przeoczyłem?

[edytuj] Wydaje mi się, że jestem dość niejasny w tym, czego szukam. Zasadniczo szukam czegoś takiego jak py2exe, które wytworzy pojedynczy plik (lub 2 pliki) z danego skryptu Pythona, automatycznie włączając wszystkie importowane moduły.

Na przykład, jeśli mam następujące dwa pliki:

[\foo\module.py] 
def example(): 
    print "Hello" 

[\bar\program.py] 
import module 
module.example() 

I biegnę:

cd \bar 
set PYTHONPATH=\foo 
program.py 

Wtedy to będzie działać. Co chcę jest aby móc powiedzieć:

magic program.py 

i kończy się z jednego pliku, lub ewentualnie pliku i zamek błyskawiczny, który można następnie skopiować do Linuksa i metę. Nie chcę instalować moich modułów w docelowym systemie Linux.

+0

Myślę, że szukasz pakietu [http://docs.python.org/tutorial/modules.html#packages] (tak opisuje Drahkar w swojej odpowiedzi). Zobacz pytanie [this] (http://stackoverflow.com/questions/4155914/how-to-create-a-python-2-x-package-simple-case) i doskonale przyjętą odpowiedź. – Chris

+0

Możliwy duplikat [Packing Python files w jednym skrypcie .py] (http://stackoverflow.com/questions/4368040/packing-python-files-into-a-single-py-script) –

Odpowiedz

0

Udało mi się znaleźć rozwiązanie obejmujące moduł module, kompilator i funkcję zip, która działa dobrze. Niestety nie mogę wkleić program roboczy tutaj jak to przemieszane z innym kodem nieistotnego, ale oto kilka fragmentów:

zipfile = ZipFile(os.path.join(dest_dir, zip_name), 'w', ZIP_DEFLATED) 
sys.path.insert(0, '.') 
finder = ModuleFinder() 
finder.run_script(source_name) 

for name, mod in finder.modules.iteritems(): 
    filename = mod.__file__ 
    if filename is None: 
     continue 
    if "python" in filename.lower(): 
     continue 

    subprocess.call('"%s" -OO -m py_compile "%s"' % (python_exe, filename)) 

    zipfile.write(filename, dest_path) 
3

Powinieneś utworzyć plik jajka. To jest archiwum plików Pythona.

Zobacz to pytanie wskazówek: How to create Python egg file

+0

Nie potrzebuję pakiet do tego? – xorsyst

+0

@systor: jeśli twoje pliki są przechowywane w zwariowanych lokalizacjach, nie obrażaj ich w pakiet i wdrażaj pojedynczy plik. Cokolwiek myślisz, tak naprawdę nie jest tak, że musisz mieć mnóstwo plików w dziwnych miejscach. – Marcin

+0

Nie pracuję w próżni. W rzeczywistości jest tak, że importuję moduły z różnych bibliotek, które znajdują się w selekcji zwariowanych miejsc i nic nie mogę na to poradzić. – xorsyst

0

brałeś pod uwagę względy Automatic script creation z oficjalnej dystrybucji rozwiązanie pakowania.

Co robisz to create a setup.py dla ciebie program i zapewnia punkty wejścia, które zostaną przekształcone w pliki wykonywalne, które będziesz mógł uruchomić. W ten sposób nie trzeba zmieniać układu źródłowego, mając jednocześnie możliwość łatwego dystrybuowania i uruchamiania programu.

Znajdziesz przykład na prawdziwej aplikacji tego systemu w gunicorn's setup.py

+0

Brzmi interesująco, ale kiedy spróbowałem podany przykład nie działał. Czy możesz podać przykład użycia tego? – xorsyst

+0

@xorsyst Dodałem przykład w odpowiedzi. – amirouche

+0

Dzięki. Próbowałem tego, ale nie działało. Zbudował suwak zawierający wszystko w moim bieżącym katalogu i nie uwzględnił moich importowanych modułów. Czy używam go źle? – xorsyst

0

Jedynym sposobem na wysłanie pojedynczego .py jest, jeśli kod z wszystkich różnych modułów zostały przeniesione do pojedynczego skryptu i swojej "Muszę przerobić wszystko, aby odnosić się do nowych lokalizacji.

Lepszym sposobem na zrobienie tego byłoby przeniesienie modułów, o których mowa, do podkatalogów w tym samym katalogu, co polecenie. Następnie możesz upewnić się, że podkatalog zawierający moduł ma __init__.py, który importuje główny plik modułu. W tym momencie możesz odwoływać się do rzeczy przez to.

Na przykład:

App klasyfikacji: /test

Moduł klasyfikacji: /test/hello

/test/hello/__init__.py treść:

import sayhello 

/test/hello/sayhello.py treść:

def print_hello(): 
    print 'hello!' 

/test/test.py treść:

#!/usr/bin/python2.7 

import hello 

hello.sayhello.print_hello() 

Jeśli prowadzisz /test/test.py widać, że działa on funkcję print_hello z katalogu modułu w ramach istniejącego katalogu, bez zmiany swojej PYTHONPATH wymagane.

+0

Niestety, przenoszenie plików źródłowych dookoła nie jest możliwe. – xorsyst

+0

Jestem trochę zdezorientowany. Teraz sprzeczasz się z poprzednim stwierdzeniem w pytaniu na górze. Stwierdziłeś, że chcesz przenieść wszystko do jednego katalogu/pliku.Jeśli nie możesz przenieść żadnego z omawianych modułów, nie możesz nawet zrobić tego, o co prosisz, ze względu na własne wewnętrzne zasady, wszystkie techniczne ograniczenia na bok. – Drahkar

+0

Przepraszamy za zamieszanie. Nie mogę trwale przenosić plików w moim systemie. Co chcę zrobić, to zebrać wszystkie niezbędne pliki źródłowe w jeden plik, który mogę umieścić w systemie docelowym, aby uruchomić python. Nie chcę instalować tam bibliotek. Zasadniczo szukam py2exe, ale to tworzy archiwum źródłowe, które jest wieloplatformowe. – xorsyst

0

Jeśli chcesz spakować skrypt ze wszystkimi jego zależnościami do pojedynczego pliku (nie będzie to plik .py), powinieneś zajrzeć do virtualenv. Jest to narzędzie, które pozwala budować środowisko piaskownicy, aby zainstalować pakiety Python i zarządzać wszystkimi problemami PATH, PYTHONPATH i LD_LIBRARY_PATH, aby upewnić się, że środowisko sandbox jest całkowicie niezależne.

Jeśli zaczniesz od dziewiczego Pythona bez zainstalowanych dodatkowych bibliotek, to easy_install twoich zależności w środowisku wirtualnym, skończysz z wbudowanym projektem w virtualenv, który wymaga tylko uruchomienia Pythona.

Piaskownica to drzewo katalogów, a nie pojedynczy plik, ale w celu dystrybucji można go skompresować/skompresować. Nigdy nie próbowałem dystrybucji env, więc nie może być zależności ścieżek, nie jestem pewien.

Może zaistnieć potrzeba dystrybuowania skryptu budowania, który tworzy wirtualne środowisko na komputerze docelowym. zc.buildout to narzędzie, które pomaga zautomatyzować ten proces, przypominając "make install", która jest ściśle zintegrowana z systemem pakietów Python i PyPI.

+0

Powinieneś użyć 'pip' z virtualenv zamiast' easy_install'. – Marcin

+0

Interesujący moduł - ale nie sądzę, że mogę go użyć do stworzenia środowiska w systemie Windows, a następnie przenieść go na Linuksa – xorsyst

+0

Nie, zdecydowanie nie. Możesz być w stanie stworzyć skrypt buildout, który automatycznie tworzy i zapełnia środowisko wirtualne. –

3

Zastosowanie stickytape moduł

stickytape scripts/blah --add-python-path . > /tmp/blah-standalone 
+0

To wydaje się być świetny pomysł, dzięki. – xorsyst

0

Można spróbować konwersji skryptu do pliku wykonywalnego. pierwsze, zastosowanie:

pip zainstalować pyinstaller

Po typu instalacji (upewnij się, że są w pliku z katalogu procentowej):

pyinstaller --onefile --windowed filename.py

Spowoduje to utworzenie wykonywalnej wersji skryptu zawierającego wszystkie niezbędne moduły. Następnie możesz przenieść (skopiować i wkleić) ten plik wykonywalny na komputer lub maszynę, na której chcesz uruchomić skrypt.

Mam nadzieję, że to pomoże.

Powiązane problemy