Python distribusjon og / usr / bin / env portabilitet

stemmer
12

I begynnelsen av alle mine kjør Python-skript jeg satte shebang linje:

#!/usr/bin/env python

Jeg kjører disse skriptene på et system der env pythongir en Python 2.2 miljø. Mine scripts raskt mislykkes fordi jeg har en manuell sjekk på en kompatibel Python versjon:

if sys.version_info < (2, 4):
    raise ImportError(Cannot run with Python version < 2.4)

Jeg ønsker ikke å måtte endre shebang linjen på hver kjørbar fil, hvis det er mulig; men jeg har ikke administrativ tilgang til maskinen for å endre resultatet av env python, og jeg ønsker ikke å tvinge en bestemt versjon, som i:

#!/usr/bin/env python2.4

Jeg ønsker å unngå dette fordi systemet kan ha en nyere versjon enn Python 2.4, eller kan ha Python 2.5, men ingen Python 2.4.

Hva er den elegante løsningen?

[Edit:] Jeg var ikke spesifikke nok i stille spørsmålet - Jeg vil gjerne fortelle brukerne kjøre scriptene uten manuell konfigurering (f.eks sti endring eller symbolske koblinger i ~/binog sikre PATH har ~/binfør Python 2.2 banen). Kanskje noen distribusjon verktøy er nødvendig for å hindre at de manuelle tweaks?

Publisert på 02/09/2008 klokken 21:21
kilden bruker
På andre språk...                            


5 svar

stemmer
8

"Env" bare utfører det første den finner i PATH env var. For å bytte til annen python, foran katalogen for at python kjør til banen før påkalle skriptet.

Svarte 02/09/2008 kl. 21:25
kilden bruker

stemmer
4

Pretty hackish løsning - hvis sjekken mislykkes, kan du bruke denne funksjonen (som trolig kunne bli betydelig forbedret) for å finne den beste tolk tilgjengelig, avgjøre om det er akseptabelt, og hvis så relansere skriptet med os.system eller noe lignende og dine sys. argv med den nye tolken.

import os
import glob
def best_python():
    plist = []
    for i in os.getenv("PATH").split(":"):
        for j in glob.glob(os.path.join(i, "python2.[0-9]")):
             plist.append(os.path.join(i, j))
    plist.sort()
    plist.reverse()
    if len(plist) == 0: return None
    return plist[0]
Svarte 03/09/2008 kl. 20:32
kilden bruker

stemmer
2

Hvis du kjører skriptene så kan du sette PATH til å peke på en privat bin først:

$ mkdir ~/bin
$ ln -s `which python2.4` ~/bin/python
$ export PATH=~/bin:$PATH

Så når du kjører din Python-skript det kommer til å bruke python 2.4. Du må endre påloggingsskript for å endre PATH.

Alternativt kjøre Python-skript med eksplisitt tolk du ønsker:

$ /path/to/python2.4 <your script>
Svarte 02/09/2008 kl. 21:28
kilden bruker

stemmer
0

Her er en løsning hvis du er (1) helt satt på med shebangs og (2) i stand til å bruke Autotools i byggeprosessen.

Jeg fant i går kveld at du kan bruke autoconf makro AM_PATH_PYTHONfor å finne en minimal Python to binære. Hvordan-er her .

Så, ville prosessen være:

  • Utstede en AM_PATH_PYTHON(2.4)iconfigure.ac
  • Endre navn på alle dine .pyskript for å .py.in(i min erfaring, betyr ikke forvirre vi)
  • Navn alle disse Python-skript du ønsker å generere med AC_CONFIG_FILES.
  • I stedet for å starte med #!/usr/bin/env python, bruker#!@PYTHON@

Så din resulterende Python skript vil alltid ha en passende shebang.

Så har du denne løsningen, minst mulig, hvis ikke praktisk.

Svarte 04/10/2013 kl. 18:27
kilden bruker

stemmer
0

@morais: Det er en interessant idé, men jeg tror kanskje vi kan ta det ett skritt lenger. Kanskje det er en måte å bruke Ian Bicking er virtualenv til:

  • Se om vi kjører i passende omgivelser til å begynne med, og hvis så, gjør ingenting.
  • Sjekk om det finnes en versjon spesifikke kjørbar på PATH, altså sjekke om python2.xdet finnes for x in reverse(range(4, 10)). I så fall gjen kjøre kommandoen med bedre tolk.
  • Hvis det ikke finnes bedre tolk, bruker virtualenv å prøve og installere en nyere versjon av Python fra den eldre versjonen av Python og få noen forutsetning pakker.

Jeg aner ikke om virtualenv er i stand til dette, så jeg skal gå rote rundt med den en gang snart. :)

Svarte 03/09/2008 kl. 23:07
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more