2012-07-11 9 views
17

Mam prosty skrypt, który jest zależny od dnspython dla parsowania plików strefy. Chciałbym rozpowszechniać ten skrypt jako pojedynczy .py, który użytkownicy mogą uruchamiać tak długo, jak długo mają zainstalowaną wersję 2.6/2.7. Nie chcę, aby użytkownik instalował zależności na poziomie całej witryny, ponieważ mogą występować konflikty z istniejącymi pakietami/wersjami, ani nie chcę, aby były zfałszowane za pomocą virtualenv. Zastanawiam się, czy istnieje sposób na osadzenie w skrypcie pakietu, takiego jak dnspython (gzip/base64) i dostęp do tego pakietu w czasie wykonywania. Być może rozpakuj go do katalogu w/tmp i dodaj to do sys.path? Nie martwię się o obciążenie związane z uruchamianiem, chcę tylko jedną .py z wszystkimi zależnościami, które mogę dystrybuować.Czy istnieje sposób na osadzanie zależności w skrypcie pythona?

Ponadto, nie byłoby żadnych zależności C do zbudowania, tylko czyste pakiety Pythona.

Edytuj: Skrypt nie musi być plikiem .py. Tak długo, jak jest to pojedynczy plik wykonywalny.

+3

Jeśli możesz złagodzić ograniczenie jednego pliku, możesz po prostu spakować bibliotekę dnspython obok pliku .py, albo jako plik zip lub zwykły plik autonomiczny - który rozwiąże problem zależności. Czy jesteś nieugięty w kwestii posiadania tylko jednego pliku? –

+4

Droga do piekła licencyjnego jest wybrukowana z osadzaniem ... –

+0

@MahmoudAbdelkader Przypuszczam, że zadziała. Python będzie szukał w bieżącym katalogu pakietu, zanim zajrzy gdzie indziej (chociaż uważam, że kolejność ta zmienia się w 3). Nadal żałuję, że nie było sposobu, aby spakować wszystkie zależności jako jeden plik wykonywalny, który użytkownik może uruchomić i nie mieć żadnych problemów. Przypuszczam, że nie musi to być .py. –

Odpowiedz

8

Możesz spakować wiele plików w Pythonie do .egg. Pliki jajek to w zasadzie tylko archiwa zip z dobrze zdefiniowanymi metadanymi - spójrz na dokumentację setuptools, aby zobaczyć, jak to zrobić. Za pomocą pliku docs można bezpośrednio wykonywać pliki jaj, określając punkt wejścia. To da ci pojedynczy plik wykonywalny, który może zawierać twój kod + wszelkie inne zależności.

EDYCJA: W dzisiejszych czasach polecam zbudować pex, aby to zrobić. pex to w zasadzie plik wykonywalny zip z zależnościami od non stdlib. Nie zawiera dystrybucji pythona (jak py2app/py2exe), ale zawiera wszystko inne i można ją zbudować za pomocą pojedynczego wywołania linii poleceń. https://pex.readthedocs.org/en/latest/

+1

Dzięki, starałem się teraz zbudować jajko z setuptools. Nigdy wcześniej nie budowałem jajka, ponieważ zawsze słyszałem, że wypadły z łaski. –

2

proszę nie rób tego. Jeśli to zrobisz, NIE rób tego z przyzwyczajenia.

  • pydns jest BDS licencjonowany ale jeśli spróbujesz „osadzenia” moduł GPL w ten sposób można uzyskać w kłopoty
  • można nauczyć się korzystać setuptools i będzie o wiele szczęśliwszy w dłuższej perspektywie
  • Setuptools obsłuży instalację zidentyfikowanych zależności (nie jestem pewien, czy używany pydns jest czystym pythonem, więc możesz utworzyć problemy dla użytkowników, jeśli spróbujesz dodać go samodzielnie, nie znając ich środowiska).
  • możesz ustaw adres URL lub pypi, aby ludzie mogli zaktualizować skrypt za pomocą easy_install -U
+0

Pakiet, którego używam to dnspython, a nie pydns.Jeśli setuptools może zbudować mi pojedynczy plik wykonywalny, który wymaga tylko Pythona 2.6/2.7, użyję go. Jeśli mówisz, że po prostu używasz go do instalowania witryn zależnych, to nie o to pytam. dnspython jest czystym pythonem i nie widzę niczego w jego licencji, co uniemożliwiłoby mi jego osadzenie. Użytkownicy końcowi nie są programistami i nie wiedzą nic o ekosystemie Pythona (setuptools/easy_install/pip/virtaulenv/etc). –

3

Najprostszym sposobem jest umieszczenie skryptu Pythona o nazwie __main__.py z czystymi zależnościami Pythona w archiwum zip, example.

W przeciwnym razie można użyć PyInstaller do utworzenia samodzielnego pliku wykonywalnego.

Powiązane problemy