W zależności od systemu python
== python2
lub python
== python3
.
Wykonalne skrypty Pythona, zaczynają się od:
#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3...
W przypadku python py3k jest to zawarte w dokumentacji, której powinienem / mogę używać z numerem wersji , więc robię to:
#!/usr/bin/env python3
Ale znalazłem problem ze skryptami py2k.
Podczas gdy w py2k dokumentacji jest napisane do użytku: #! /usr/bin/env python
,
na niektórych * nix-es python py3k jest domyślny, więc python == python3. (Na przykład pakiet Python ArchLinux , tutaj pliki pakietu Python ).
Jak spakować (skonfigurować, wykonać) i / lub przygotować skrypty Pythona do dystrybucji, aby sobie z tym poradzić?
Pytam o tworzenie pakietów oprogramowania, które mogą być łatwo uruchamiane przez użytkowników (bez modyfikowania środowiska)
Mogę zrobić tę samą sztuczkę dla skryptów Pythona py2k jako skrypty python py3k i ustawić go jako: #!/usr/bin/env python2
? Czy mogę mieć pewność, że każda dystrybucja py2k w Pythonie zawiera python2
plik, więc #!/usr/bin/env python2
będzie działać?
Jeśli tak, dlaczego nie jest proponowany jako standard, na przykład w dokumentacji Python py2k ?
źródło
python2
do uruchomienia (jeśli jest zainstalowany) i zawsze możesz sprawdzić wersję za pomocąpython -V
. jeśli chcesz, żepython
będzie to 2 lub 3, powinieneś,rm /usr/bin/python
a następnie utworzyć dowiązanie symboliczne, które wskazuje z twojej żądanej wersji Pythona npln -s /usr/bin/python2.5 /usr/bin/python
.python2
. Zastanawiam się, dlaczego nie jest standardem używać go, gdy jest py2k i py3k, a domyślnepython
mogą się różnić. Co z twoją radą na temat usuwania - to nie jest właściwe dla tego przykładu, ponieważ pytam o opakowanie. Chciałbym stworzyć pakiet, który może działać w różnych konfiguracjach / systemach. Nie ma mowy o modyfikacji środowiska. A co z sprawdzaniem - nie dotyczy Shebang - o ile wiem.#!...python2
w swoich programach, a jeśli używasz Python 3.x, użyj#!...python3
. Nie polegaj na systemie operacyjnym, aby mieć odpowiedni link, jeśli wiesz, że będzie działał tylko w określonej wersji. Pracuję z systemami, które wciąż mają zainstalowany Python 1.5.2 jako/usr/bin/python
- Piszę kod do obsługi starszych wersji Pythona lub używam gopython2
.python2
pliku wykonywalnego w moim systemie (ściśnięcie Debiana).python
jest dowiązaniem symbolicznym dopython2.6
ipython3
jest dowiązaniem symbolicznym dopython3.1
, ale nie mapython2
.Odpowiedzi:
Skrypt może sprawdzić swoją wersję w języku Python, a jeśli jest to język Python 3, uruchom go ponownie przy użyciu języka Python 2. Dodaj następujące polecenie w pobliżu nagłówka skryptu:
Używa polecenia systemu
which
do zlokalizowaniapython2
w środowiskuPATH
. Następnie uruchamia się ponownie z tym (lub przerywa, jeśli nie można go znaleźć).Zauważ, że skrypt musi mieć poprawną składnię w języku Python 3, aby mógł się uruchomić w języku Python 3.
Ponadto każde wyjście powinno zostać opróżnione przed
execv
połączeniem, w przeciwnym razie zostanie utracone. Dodanie na przykładsys.stdout.flush()
tuż przed wywołaniemexecv
spowoduje opróżnienie wszystkichprint
instrukcji.źródło
W starszych wersjach może po prostu być
python
zamiastpython2
. Aby Twoja linia sheebang była wyraźniejsza, możesz utworzyć linkpython2 -> python
, abyś mógł z niej korzystać#!/usr/bin/env python2
.źródło
Myślę, że „standard” jest zdefiniowany w https://www.python.org/dev/peps/pep-0394/
źródło