2010-08-27 8 views
21

Czy istnieje standardowy sposób, aby upewnić się, że skrypt Pythona będzie interpretowany przez python2, a nie python3? W mojej dystrybucji mogę używać #!/Usr/bin/env python2 jako shebang, ale wydaje się, że nie wszystkie dystrybucje wysyłają "python2". Mogłem jawnie wywołać konkretną wersję (np. 2.6) Pythona, ale to wykluczałoby ludzi, którzy nie mają tej wersji.Czy istnieje standardowy sposób, aby upewnić się, że skrypt Pythona będzie interpretowany przez python2, a nie python3?

Wydaje mi się, że będzie to coraz większym problemem, gdy dystrybutor rozpocznie używanie python3 jako domyślnego interpretera pythonów.

Odpowiedz

7

To jest trochę nieporządny problem w czasie, który będzie bardzo długi okres przejściowy. Niestety, nie istnieje żaden bezpieczny, wieloplatformowy sposób zagwarantowania, która wersja Pythona jest wywoływana, poza tym, że sam skrypt Python sprawdza się po uruchomieniu. Wiele, jeśli nie większość, dystrybucji, które dostarczają Python 3, zapewnia, że ​​ogólne polecenie python jest domyślnie aliasingowane do najnowszej wersji Pythona 2, podczas gdy python3 jest aliowane do najnowszego Pythona 3. Te dystrybucje, które nie powinny być zachęcane do wykonania więc. Ale nie ma gwarancji, że użytkownik tego nie zastąpi.Myślę, że najlepszą praktyką dostępną w przewidywalnej przyszłości jest, aby pakowacze, dystrybutorzy i użytkownicy przyjmowali, że python odnosi się do Pythona 2 i, w razie potrzeby, budują sprawdzanie w czasie wykonywania w skrypcie.

+0

I, jeśli to konieczne, jak zaznacza kwatford w swoim komentarzu, dołącz czek w czasie instalacji w pakiecie 'setup.py' lub jego odpowiednik od' setuptools', 'Distribute',' pip' et al. na ogół zmieniają linie skryptów, aby wskazywały na instalację instancji Pythona. –

+2

IMHO tam zawsze powinno być dostępne dowiązanie symboliczne "python2", aby w przyszłości móc [łatwo odróżnić shebangi] (http://unix.stackexchange.com/questions/26573/python-python2-or-python-python3-how- to-package-distribute-python-py2k) –

+1

@Grzegorz: Python PEP 394 jest otwarty na ten temat i prawdopodobnie zostanie zaimplementowany w przyszłej aktualizacji do Python 2: http://bugs.python.org/issue12627 –

11

http://docs.python.org/library/sys.html#sys.version_info

użyciu modułu sys można określić wersję Pythona, który jest uruchomiony i podnieść wyjątek lub wyjście lub cokolwiek chcesz.

UPDATE:

Można to wykorzystać do wywołania odpowiedniego tłumacza. Na przykład, ustaw mały skrypt, który sprawdza to i używaj go w shbang. Sprawdzi, czy uruchomiona jest wersja pythona, a jeśli nie to, czego szukasz, szuka jednego, którego chcesz. Następnie uruchomiłby skrypt w tej wersji Pythona (lub, jeśli nic dobrego nie zostanie znalezione).

+1

zobaczyć mój komentarz jathanism. –

0

Rozumiem, że różne dystrybucje będą znajdować się w różnych miejscach dysku. Oto kilka sugestii, które przychodzą Ci na myśl -

  1. Możesz używać aliasu UNIX do tworzenia skrótów wskazujących różne dystrybucje. Np .: alias py2 = "/ usr/bin/python2.X". Tak więc po uruchomieniu skryptu można użyć py2 xx.py
  2. W inny sposób można zmodyfikować zmienną środowiskową PYTHON_PATH.
  3. A jeśli się nie mylę, w module sys znajduje się przepis na pobranie aktualnego numeru wersji pythona. Możesz uzyskać odpowiednią transakcję: &.

To powinno wystarczyć ...

+3

Rozdzielam aplikację python, moim problemem jest upewnienie się, że ** wszyscy użytkownicy ** używają Pythona2.x do uruchamiania mojej aplikacji. –

7

Korzystanie sys.version_info można zrobić prosty test wartości przeciwko niemu. Na przykład, jeśli tylko chcesz wesprzeć wersji 2.6 lub niższy:

import sys 
if sys.version_info > (2,6): 
    sys.exit("Sorry, only we only support up to Python 2.6!") 
+1

To nie jest to, czego chcę, chcę, aby dobry interpreter został wybrany automatycznie, aby nie drukować komunikatu o błędzie, jeśli wybrano niewłaściwy: -/ –

+0

Ostateczna odpowiedź na twoje pytanie brzmi: "Nie, nie ma standardowego sposobu upewnij się, że skrypt python zostanie zinterpretowany przez python2, a nie python3. " To, o co prosiłeś, to upewnić się, że Python2 został wybrany na 3. Nie określiłeś, że chcesz, aby poprawny interpreter został wybrany automatycznie. Jedynym sposobem, w jaki możesz to zrobić na pewno, byłoby zaimplementowanie sprawdzenia przed wywołaniem programu (tak jak w przypadku skryptu powłoki), który następnie uruchamia twój kod Pythona względem żądanego interpretera Pythona. – jathanism

+2

Oczekiwanie, że "dobry tłumacz zostanie wybrany automatycznie" jest absurdem. Plik nie może wymusić, który program go uruchomi. –

-1

wierzę, że to zrobi, co chcesz, a mianowicie test na nieswoiste wersji Pythona mniej niż 3.x (tak długo, jak to robi zawierają oświadczenie from __future__ import print_function).

try: 
    py3 = eval('print') 
except SyntaxError: 
    py3 = False 

if py3: exit('requires Python 2') 
... 

Działa poprzez badania, aby zobaczyć czy print to funkcja wbudowana w przeciwieństwie do oświadczenia, jak to jest w Python3. Gdy nie jest to funkcja, funkcja eval() spowoduje zgłoszenie wyjątku, co oznacza, że ​​kod działa na interprerze pre-Python 3.0 z powyższym zastrzeżeniem.

2

Nie do końca taka sama sytuacja, ale firma, w której pracuję, ma aplikację, która może uruchamiać skrypty w języku Python (wśród wielu funkcji). Po licznych problemach związanych z obsługą instalacji Pythona na różnych platformach, zdecydowaliśmy się po prostu zainstalować z aplikacją naszego własnego interpretera języka Python. W ten sposób wiemy dokładnie, gdzie jest zainstalowany i jaka to wersja. Takie podejście może być zbyt duże dla twoich potrzeb (pakiet Python to tylko około 10% bitów naszej aplikacji), ale na pewno działa.

+0

To jest faktycznie świetne podejście, które eliminuje wszelkie manipulacje wymagane w przypadku tak sztywnego wymogu. – jathanism

2

W zależności od tego, jak je dystrybuujesz, tak myślę.

Jeśli używasz normalnego setup.py plik do zarządzania dystrybucją, mieć go bombardować, jeśli użytkownik próbuje zainstalować go w Pythonie 3.

Po jej zainstalowaniu shebang skryptu konsoli stworzonej przez (powiedzmy) setuptools będą prawdopodobnie powiązane z konkretnym interpreterem używanym do jego instalacji.

Jeśli robisz coś dziwnego dla twojej instalacji, możesz w dowolnym skrypcie instalacyjnym, którego używasz, szukać interpreterów języka Python i przechowywać wybór. Najpierw sprawdź, czy coś, co nazywa się "python", to 2.x. Jeśli nie, sprawdź, "python2.7", "python2.6", itp, aby zobaczyć, co jest dostępne.

0

Możesz użyć autotools, aby wybrać interpreter języka Python 2. Here to jak to zrobić. Zagwarantowanie poprawnego shebanga może być trudne do wykonania; here jest jednym ze sposobów, aby to zrobić. Może łatwiej będzie po prostu mieć lekki skrypt Bash otoki, wrapper.sh.in, który wygląda mniej więcej tak:

#!/bin/bash 
PYTHON2="@[email protected]" #That first link enables this autotool variable 
"$PYTHON2" "[email protected]" #Call the desired Python 2 script with its arguments 

Wezwania wrapper.sh (po ./configure) takich jak:

./wrapper.sh my_python2_script.py --an_option an_argument