
Στην αρχή όλα μου τα σενάρια εκτελέσιμο Python έβαλα το [shebang](http://en.wikipedia.org/wiki/Shebang_(Unix)) γραμμή:



```
#!/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). Ίσως κάποια χρησιμότητα διανομή απαιτείται για να αποτρέψει τις οδηγίες τσιμπήματα;

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



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

 

Εάν εκτελείτε τα σενάρια τότε μπορείτε να ορίσετε μεταβλητή 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>

```
 

Αρκετά 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]

```
 

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


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


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

 

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


Απλά βρέθηκε χθες το βράδυ που μπορείτε να χρησιμοποιήσετε τη μακροεντολή autoconf `AM_PATH_PYTHON`να βρουν μια ελάχιστη Python **2** δυαδικό. Το πώς-να είναι [εδώ](https://stackoverflow.com/a/19173018/1207160) .


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


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


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


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

 