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 né, 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.
sicuro ... purché si utilizzino costrutti di linguaggio comuni a entrambi ... –
il problema è come scrivere la prima riga #/usr/bin/env python [2.x | 3.x] su trova l'interprete – xielingyun
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