2013-01-04 19 views
5

ho migliaia di server (linux), alcuni solo python 2.x e alcuni solo python 3.x, voglio scrivere uno script check.py può girare su tutti i server come $./check.py senza usare $ python check.py o $ python3 check.py, c'è un modo per farlo?uno script python può essere eseguito sia con python 2.x sia con python 3.x

mia domanda è come lo script check.py di trovare l'interprete, non importa l'interprete è python2.X e python3.x

+1

sicuro ... purché si utilizzino costrutti di linguaggio comuni a entrambi ... –

+0

il problema è come scrivere la prima riga #/usr/bin/env python [2.x | 3.x] su trova l'interprete – xielingyun

+0

Perché è un problema? Basta eseguire 'python'; su un sistema con solo 2.x, o con entrambi 2.xe 3.x, sarà 2.x; su un sistema con solo 3.x, dovrebbe essere 3.x. – abarnert

risposta

13

Molti script possono essere eseguiti sia su 2.x che su 3.x. (Ho un gruppo su cui lavoro quotidianamente e ho convertito varie librerie open source da 2.x-only a dual-version.)

Alcune cose rendono molto più semplice:

  • Richiedi 2.7 o almeno 2.6+ per utenti 2.x. Altrimenti, ad esempio, non è possibile generare ed eccezioni con parametri o catturarli in variabili e altre limitazioni così gravi.
  • Richiedi 3.3+ o almeno 3.2+ per utenti 3.x. La maggior parte delle incompatibilità gratuite (come il prefisso u portato via) sono state invertite in 3.2 o 3.3.
  • Utilizzare la libreria six.
  • Utilizzare le istruzioni __future__.
  • sempre essere chiaro in testa circa se vuoi dire bytes (sempre a 8 bit), unicode (deve codificare se si vuole a 8 bit), o str (qualunque sia la maggior parte delle API stdlib aspettano), e encode e decode come necessario.
  • Eseguire regolarmente 2to3 sul codice. (Ma non fare ciecamente tutto ciò che dice.Se, ad esempio, stai utilizzando d.keys() o map(f, l) perché non ti importa se torni a list o no, riceverai un avviso, perché 2to3 non lo sa non vi preoccupate.)

in alternativa, invece di cercare di scrivere il codice che viene eseguito su entrambi, scrivere il codice che gira su 2.x, ma possono essere trasformati automaticamente in 2to3 esecuzione di codice 3.xe effettuare quella parte del processo di installazione (in setup.py, if sys.version_info >= (3, 0): fare il passaggio 2to3).

Dalla tua modifica, sembra che tu sia principalmente interessato a cosa inserire nella #! linea. Per questo:

/usr/bin/env python 

Questo non è garantito il funzionamento, ma poi env non è garantito a lavorare nel primo posto ... si può contare sul fatto che:

  • praticamente su qualsiasi sistema in cui l'unica piattaforma/forniture distro 2.x, python è Python 2.
  • praticamente su qualsiasi sistema in cui le forniture piattaforma/distro entrambi, python è Python 2.
  • praticamente su qualsiasi sistema in cui la piattaforma/d istro fornisce solo 3.x (che attualmente è molto raro, ma sarà presumibilmente alla fine essere più comune), python è Python 3.

Tuttavia:

  • In un sistema in cui le forniture piattaforma , se l'amministratore solo installato 3.x, sarà probabilmente (a partire dal 2013) non disponibile come python. Non c'è molto che puoi fare per questo.

Se l'ultimo è un problema serio, si può lavorare intorno ad esso con l'aggiunta di uno script lanciatore, scritto in sh, che cerca python e poi cerca python3 se fallisce.

Il modo migliore per farlo è specificare lo script di avvio stesso come interprete shebang nel proprio script Python. Linux può gestirlo, ma è configurabile e almeno alcune distribuzioni lo disabilitano di default, e molti altri sistemi * nix non possono farlo.

Se questo non funziona, l'opzione migliore è quella di rendere l'utente eseguire lo script-che Launcher è, dire loro di fare ./check.sh invece di ./check.py, e check.sh capisce il diritto interprete Python e corre per la $python ./check.py utente.

Se vuoi diventare davvero complicato, puoi anche incorporare lo script Python come un heredoc all'interno dello script della shell, quindi devi solo distribuire un file. Corrono ./check.sh e trova il Python corretto e lo esegue su heredoc.

+0

thx, voglio solo farlo in questo modo, ma non è una mia domanda, penso che correre con python3 può usare solo #!/Usr/bin/env python3, un errore – xielingyun

+0

@xielingyun: Le piattaforme più popolari installano solo 2 .x, o installa entrambi. Ma ci sono alcuni sistemi che non hanno né l'uno né l'altro - e, come ho detto, se l'amministratore installa solo 3.x (specialmente se installa da python.org invece di usare un pacchetto distro) probabilmente non sarà disponibile come 'python '. Questo è un problema serio per te? Se sì, con quale piattaforma hai a che fare? – abarnert

+0

@xielingyun: ho modificato la risposta con un aiuto generale per quel caso, ma come ho detto, non funzionerà su tutte le piattaforme. – abarnert

0

Considerando che Python 3.x non è del tutto compatibile con Python 2.x, è avrebbe dovuto assicurarsi che lo script fosse compatibile con entrambe le versioni. Questo può essere fatto con l'aiuto dello strumento 2to3, ma in fin dei conti potrebbe significare eseguire due distinti script Python.

Problemi correlati