2010-08-27 10 views
21

Esiste un modo standard per assicurarsi che uno script python venga interpretato da python2 e non da python3? Sulla mia distro, posso usare #!/Usr/bin/env python2 come shebang, ma sembra che non tutte le distribuzioni spediscano "python2". Potrei chiamare esplicitamente una versione specifica (ad esempio 2.6) di python, ma ciò escluderebbe le persone che non hanno quella versione.Esiste un modo standard per assicurarsi che uno script python venga interpretato da python2 e non da python3?

Mi sembra che questo sarà sempre più un problema quando le distro inizieranno a mettere python3 come interprete python predefinito.

risposta

7

Questo è un problema un po 'disordinato durante quello che sarà un periodo di transizione molto lungo. Sfortunatamente, non esiste alcun modo infallibile e multipiattaforma per garantire quale versione di Python viene invocata, a parte il fatto che lo script Python stesso controlli una volta avviato. Molte, se non la maggior parte, distribuzioni che distribuiscono Python 3 assicurano che il comando generico python sia alias di default alla versione più recente di Python 2 mentre python3 è alias al più recente Python 3. Quelle distribuzioni che non dovrebbero essere incoraggiate a fare così. Ma non vi è alcuna garanzia che un utente non lo sovrascriva.Penso che la best practice disponibile per il futuro prevedibile sia quella per gli imballatori, i distributori e gli utenti di assumere python in riferimento a Python 2 e, laddove necessario, creare un controllo di runtime nello script.

+0

E, se necessario, come kwatford sottolinea nel suo commento, includere un controllo al momento dell'installazione nello script 'setup.py' del pacchetto o equivalente da' setuptools', 'Distribute',' pip' et al. in genere altera le linee di shebang degli script in modo che puntino all'istanza di installazione di Python. –

+2

IMHO dovrebbe sempre essere disponibile symlink 'python2' per poterlo fare in futuro, [shebang chiaramente distinguibili] (http://unix.stackexchange.com/questions/26573/python-python2-or-python-python3-how- to-package-distribute-python-py2k) –

+1

@Grzegorz: Python PEP 394 è aperto su questo argomento e probabilmente verrà implementato in un futuro aggiornamento a Python 2: http://bugs.python.org/issue12627 –

11

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

utilizzando il modulo sys è possibile determinare la versione di Python che esegue e sollevare un'eccezione o di uscita o quello che vuoi.

UPDATE:

È possibile utilizzare questo per richiamare l'interprete appropriato. Ad esempio, configura un piccolo script che esegue il controllo e utilizzalo nello shbang. Controllerebbe la versione di Python in esecuzione, e se non è ciò che vuoi, ne cerca uno che vuoi. Quindi eseguirebbe lo script in quella versione di python (o fallirebbe se non fosse trovato nulla di buono).

+1

Vedi il mio commento a jathanism. –

0

Come ho capito diverse distro saranno in diverse posizioni nel tuo disco. Ecco alcuni suggerimenti che ti vengono in mente:

  1. È possibile utilizzare l'alias UNIX per creare collegamenti che puntano alle diverse distribuzioni. Ad esempio: alias py2 = "/ usr/bin/python2.X". Quindi, quando esegui il tuo script potresti usare py2 xx.py
  2. In alternativa, potresti modificare la tua variabile di ambiente PYTHON_PATH.
  3. Oppure, se non sbaglio, esiste una disposizione nel modulo sys per ottenere il numero di versione attuale di Python. Potresti ottenere l'affare & in modo appropriato.

Questo dovrebbe farlo ...

+3

Sto distribuendo un'applicazione python, il mio problema è assicurarmi che ** tutti gli utenti ** usino python2.x per eseguire la mia app. –

7

Usando sys.version_info si può fare un semplice test del valore contro di essa. Per esempio, se si desidera solo per supportare la versione 2.6 o inferiore:

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

Non è quello che voglio, voglio che il buon interprete sia scelto automaticamente, per non stampare un messaggio di errore se viene scelto quello sbagliato: -/ –

+0

La risposta definitiva alla tua domanda è: "No, non esiste un modo standard per assicurati che uno script python venga interpretato da python2 e non da python3. " Quello che hai chiesto era di assicurarmi che Python2 fosse scelto su 3. Non hai specificato che volevi che l'interprete corretto fosse scelto automaticamente. L'unico modo in cui potresti essere in grado di fare questo di sicuro sarebbe implementare un controllo prima che il programma venga chiamato (come con uno script di shell) che poi esegua il tuo codice Python contro l'interprete Python desiderato. – jathanism

+2

Aspettarsi che "il buon interprete da scegliere automaticamente" è assurdo. Un file non può forzare quale programma lo esegue. –

-1

Credo che questo farà ciò che si vuole, e cioè di test per una versione non specifica di Python meno di 3.x (fintanto che doesn 't contenere una dichiarazione from __future__ import print_function).

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

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

Agisce test per vedere se print è una funzione built-in al contrario di una dichiarazione, in quanto è in python3. Quando non è una funzione, la funzione eval() solleverà un'eccezione, il che significa che il codice è in esecuzione su un interprete pre-Python 3.0 con l'avvertenza sopra menzionata.

2

Non proprio la stessa situazione, ma l'azienda per cui lavoro ha un'app in grado di eseguire script Python (tra le sue numerose funzionalità). Dopo numerosi problemi di supporto che coinvolgono installazioni Python su varie piattaforme, abbiamo deciso di installare il nostro interprete Python con l'app. In questo modo sappiamo esattamente dove è installato e quale versione è. Questo approccio potrebbe essere troppo pesante per le tue esigenze (il pacchetto Python è solo il 10% circa dei bit della nostra app), ma funziona sicuramente.

+0

Questo è in realtà un grande approccio che elimina tutto il jiggering richiesto per un requisito così rigido. – jathanism

2

Dipende da come lo stai distribuendo, immagino.

Se stai usando un normale file di setup.py per gestire la vostra distribuzione, hanno E Bomba se l'utente sta cercando di installarlo in Python 3.

Una volta installato, lo shebang dello script console creato da (diciamo) setuptools sarà probabilmente collegato all'interprete specifico usato per installarlo.

Se si sta facendo qualcosa di strano per l'installazione, è possibile in qualunque script di installazione che si sta utilizzando cercare interpreti Python e memorizzare una scelta. Potresti prima verificare se tutto ciò che è chiamato "python" è un 2.x. Altrimenti, cerca "python2.7", "python2.6", ecc. Per vedere cosa è disponibile.

0

È possibile utilizzare gli autotools per selezionare un interprete Python 2. Here è come farlo. Garantire una corretta shebang può essere difficile da fare elegantemente; here è un modo per farlo. Può essere più facile per avere semplicemente uno script Bash leggero involucro, wrapper.sh.in che sembra qualcosa di simile:

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

chiamata wrapper.sh (dopo un ./configure) come:

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