python == python2 O python == python3? Come impacchettare, distribuire script py2k python?


10

A seconda del sistema, python== python2o python== python3.

Script Python eseguibili, inizia con:

#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3...

Per python py3k è fornito nella documentazione che dovrei / posso usare con il numero di versione , quindi faccio questo:

#!/usr/bin/env python3

Ma ho riscontrato un problema con gli script py2k.

Mentre in documentazione py2k è scritto per l'uso: #! /usr/bin/env python,

su alcuni * nix-es python py3k è predefinito, quindi python == python3. (Ad esempio il pacchetto python di ArchLinux , qui i file del pacchetto python ).

Come impacchettare (configurare, creare) e / o preparare script Python per la distribuzione per gestirlo?

Chiedo di creare pacchetti software che possono essere eseguiti facilmente dagli utenti (senza modificare il loro ambiente)

Posso fare lo stesso trucco per gli script python py2k come per gli script python py3k e impostarlo come: #!/usr/bin/env python2? Posso essere sicuro che ogni distribuzione di python py2k contenga python2file, quindi #!/usr/bin/env python2funzionerà?

In caso affermativo, perché non viene proposto come standard, ad esempio nella documentazione di python py2k ?


4
Per quanto ne so, puoi sempre utilizzarlo python2per eseguirlo (se installato), e puoi sempre controllare la versione con python -V. se vuoi che pythonsia 2 o 3, dovresti rm /usr/bin/pythonquindi creare un collegamento simbolico che punti dalla tua versione più desolata di Python, ad es ln -s /usr/bin/python2.5 /usr/bin/python.
Hanan N.

Grazie per avermi assicurato python2. Mi chiedo perché non sia standard usarlo quando c'è py2k e py3k e il default pythonpuò differire. Che dire dei tuoi consigli sulla rimozione - non è corretto per questo esempio, perché chiedo informazioni sulla confezione. Vorrei creare un pacchetto che può essere eseguito in diverse configurazioni / sistemi. Non c'è modo di modificare l'ambiente. Che dire del controllo - non si applica a Shebang - per quanto ne so.
Grzegorz Wierzowiecki,

Credo che ciò che @Hanan N. stia cercando di dirti è che se stai scrivendo il codice Python 2.x, quindi utilizzalo #!...python2nei tuoi programmi e se stai usando Python 3.x, quindi usa #!...python3. Non fare affidamento sul sistema operativo per avere il collegamento giusto se sai che funzionerà solo su una versione specifica. Lavoro con sistemi che hanno ancora installato Python 1.5.2 come /usr/bin/python: o scrivo codice per gestire versioni precedenti di Python o uso python2.
Arcege,

2
@Arcege Non ho un python2eseguibile sul mio sistema (compressione Debian). pythonè un collegamento simbolico a python2.6, ed python3è un collegamento simbolico a python3.1, ma non esiste python2.
Gilles 'SO- smetti di essere malvagio' l'

Risposte:


3

Uno script può controllare la sua versione di Python e, se si tratta di Python 3, riavviare se stesso utilizzando Python 2. Aggiungi quanto segue vicino alla testa dello script:

if sys.version > '3':
  python2 = os.popen('which python2 2> /dev/null').read().rstrip()
  if python2:
    args = sys.argv[:]
    args.insert(0,python2)
    os.execv(python2,args)
  else:
    sys.exit("%s requires Python Version 2 (python2 not in PATH)" % os.path.basename(__file__))

Questo utilizza il whichcomando di sistema per individuare python2nell'ambiente PATH. Quindi si riavvia con quello (o si interrompe se non riesce a trovarlo).

Nota che lo script deve essere sintassi di Python 3 valida per avviarsi in Python 3.

Inoltre, qualsiasi output deve essere scaricato prima della execvchiamata o andrà perso. L'aggiunta, ad esempio, sys.stdout.flush()appena prima della chiamata a execv, cancellerà tutte le printistruzioni.


1

Nelle versioni precedenti, potrebbe esserci semplicemente pythoninvece di python2. Per rendere più chiara la tua linea sheebang, puoi creare un link in python2 -> pythonmodo da poterlo utilizzare #!/usr/bin/env python2.


Tuttavia, non risolve il problema dichiarato. Perché la domanda è come rendere il tuo script abbastanza portatile, in modo che possa essere eseguito in tutti gli ambienti citati (con "python" "python2" ecc.)
Grzegorz Wierzowiecki

1

Penso che lo "standard" sia definito in https://www.python.org/dev/peps/pep-0394/

Questo PEP fornisce una convenzione per garantire che gli script Python possano continuare a essere portatili su tutti i sistemi * nix, indipendentemente dalla versione predefinita dell'interprete Python (ovvero la versione invocata dal comando python).

  • python2 farà riferimento ad alcune versioni di Python 2.x.
  • python3 farà riferimento ad alcune versioni di Python 3.x.
  • per il momento, tutte le distribuzioni dovrebbero garantire che python si riferisca allo stesso target di python2.
  • tuttavia, gli utenti finali dovrebbero essere consapevoli del fatto che python si riferisce a python3 almeno su Arch Linux (questa modifica è ciò che ha spinto la creazione di questo PEP), quindi python dovrebbe essere usato nella riga shebang solo per gli script che sono compatibili con sorgente sia con Python 2 e 3.
  • in preparazione di un'eventuale modifica della versione predefinita di Python, solo gli script di Python 2 devono essere aggiornati per essere compatibili con l'origine con Python 3 oppure per utilizzare python2 nella riga shebang.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.