ανάπτυξη Python και / usr / bin / env φορητότητα

ψήφοι
12

Στην αρχή όλα μου τα σενάρια εκτελέσιμο Python έβαλα το shebang γραμμή:

#!/usr/bin/env python

Τρέχω αυτά τα σενάρια σε ένα σύστημα όπου env pythonδίνει μια Python 2.2 περιβάλλον. Scripts μου γρήγορα αποτυγχάνουν επειδή έχω ένα εγχειρίδιο ελέγχου για μια συμβατή έκδοση Python:

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

Δεν θέλω να χρειαστεί να αλλάξει τη γραμμή shebang σε κάθε εκτελέσιμο αρχείο, αν είναι δυνατόν? Ωστόσο, δεν έχω πρόσβαση διαχειριστή στο μηχάνημα για να αλλάξει το αποτέλεσμα env pythonκαι δεν θέλω να αναγκάσει μια συγκεκριμένη έκδοση, όπως σε:

#!/usr/bin/env python2.4

Θα ήθελα να αποφευχθεί αυτό, διότι το σύστημα μπορεί να έχει μια νεότερη έκδοση από την Python 2.4, ή μπορεί να έχει Python 2.5, αλλά δεν Python 2.4.

Ποια είναι η κομψή λύση;

[Επεξεργασία]: Δεν ήμουν αρκετά ειδικά στο θέτοντας το ερώτημα - Θα ήθελα να επιτρέπουν στους χρήστες να εκτελούν τα σενάρια χωρίς χειροκίνητη ρύθμιση (π.χ. πορεία τροποποίηση ή δημιουργία ψευδοσυνδέσμων σε ~/binκαι την εξασφάλιση PATH σας έχει ~/binπριν από την πορεία της Python 2.2). Ίσως κάποια χρησιμότητα διανομή απαιτείται για να αποτρέψει τις οδηγίες τσιμπήματα;

Δημοσιεύθηκε 02/09/2008 στις 22:21
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
8

«Env» απλά εκτελεί το πρώτο πράγμα που βρίσκει στο var PATH env. Για να μεταβείτε σε διαφορετική python, βάζετε μπροστά από τον κατάλογο για τον πύθωνα που εκτελέσιμο στο δρόμο πριν από την επίκληση του σεναρίου σας.

Απαντήθηκε 02/09/2008 στις 22:25
πηγή χρήστη

ψήφοι
2

Εάν εκτελείτε τα σενάρια τότε μπορείτε να ορίσετε μεταβλητή PATH ώστε να οδηγεί σε ένα ιδιωτικό κατάλογο bin πρώτο:

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

Στη συνέχεια, όταν εκτελείτε το σενάριο python σας, θα χρησιμοποιήσετε την Python 2.4. Θα πρέπει να αλλάξετε σενάρια σύνδεσής σας για να αλλάξετε την πορεία σας.

Εναλλακτικά τρέξει script python σας με τη ρητή διερμηνέα που θέλετε:

$ /path/to/python2.4 <your script>
Απαντήθηκε 02/09/2008 στις 22:28
πηγή χρήστη

ψήφοι
4

Αρκετά hackish λύση - αν η επιταγή σας αποτύχει, χρησιμοποιήστε αυτή τη λειτουργία (η οποία κατά πάσα πιθανότητα θα μπορούσε να βελτιωθεί σημαντικά) για να καθορίσει την καλύτερη διαθέσιμη διερμηνέα, να καθορίσει αν είναι αποδεκτή, και αν ναι επανεκκίνηση script σας με os.system ή κάτι παρόμοιο και sys σας. argv χρησιμοποιώντας το νέο διερμηνέα.

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]
Απαντήθηκε 03/09/2008 στις 21:32
πηγή χρήστη

ψήφοι
0

@morais: Αυτή είναι μια ενδιαφέρουσα ιδέα, αλλά νομίζω ότι ίσως μπορούμε να το πάρετε ένα βήμα μακρύτερα. Ίσως υπάρχει ένας τρόπος για να χρησιμοποιήσετε virtualenv Ian Bicking για να:

  • Δείτε αν τρέχετε σε ένα αποδεκτό περιβάλλον για να αρχίσει με, και αν ναι, δεν κάνουν τίποτα.
  • Ελέγξτε αν υπάρχει μια συγκεκριμένη έκδοση εκτελέσιμο για το PATH, δηλαδή ελέγξτε αν python2.xυπάρχει for x in reverse(range(4, 10)). Αν ναι, εκτελέστε ξανά την εντολή με την καλύτερη διερμηνέα.
  • Εάν δεν υπάρχει καλύτερη διερμηνέα, χρησιμοποιήστε virtualenv να δοκιμάσετε και να εγκαταστήσετε μια νεότερη έκδοση της Python από την παλαιότερη έκδοση της Python και να πάρει όλα τα προαπαιτούμενα πακέτα.

Δεν έχω ιδέα αν virtualenv είναι σε θέση αυτή, έτσι θα πάω χάος γύρω με αυτό κάποια στιγμή σύντομα. :)

Απαντήθηκε 04/09/2008 στις 00:07
πηγή χρήστη

ψήφοι
0

Εδώ είναι μια λύση, αν είστε (1) απολύτως οριστεί για τη χρήση shebangs και (2) σε θέση να χρησιμοποιήσει Autotools στη διαδικασία κατασκευής σας.

Απλά βρέθηκε χθες το βράδυ που μπορείτε να χρησιμοποιήσετε τη μακροεντολή autoconf AM_PATH_PYTHONνα βρουν μια ελάχιστη Python 2 δυαδικό. Το πώς-να είναι εδώ .

Έτσι, η διαδικασία σας θα είναι:

  • Εκδώσει AM_PATH_PYTHON(2.4)σε σαςconfigure.ac
  • Μετονομασία όλα σας .pyτα σενάρια για την .py.in(από την εμπειρία μου, αυτό δεν συγχέει vi)
  • Όνομα όλα αυτά τα σενάρια Python θέλετε να δημιουργήσετε με AC_CONFIG_FILES.
  • Αντί να ξεκινήσετε με #!/usr/bin/env python, χρησιμοποιήστε#!@PYTHON@

Στη συνέχεια, το προκύπτον σενάρια Python θα έχει πάντα την κατάλληλη shebang.

Έτσι, έχετε τη λύση αυτή, τουλάχιστον δυνατόν, αν δεν είναι πρακτικό.

Απαντήθηκε 04/10/2013 στις 19:27
πηγή χρήστη

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