2012-08-22 16 views
14

Mam problem podczas próby uruchomienia skryptu Pythona na dwóch różnych komputerach. Na każdym komputerze chciałbym uruchomić skrypt przy użyciu wersji 2.7.3 Pythona, jednak mam problem z tym, że dwa komputery nazywają Pythona 2.7.3 na różne sposoby. Jeden z komputerów uruchamia arch-linux i na tym komputerze nazywa się python2. Na drugim komputerze działa redhat linux i używa on nazwy python2.7.3.Warunkowa linia prostokąta dla różnych wersji Pythona

Co powinienem użyć w linii Shebang, aby skrypt był wykonywany na obu komputerach bez konieczności wprowadzania jakichkolwiek zmian? To, czego naprawdę chcę, to coś w rodzaju warunkowej linii shebang, która może wybrać wersję Pythona. Czy mam pecha i muszę zachować dwie różne wersje skryptu?

P.S. Nie mogę po prostu użyć pytka #!/Usr/bin/env, ponieważ na komputerze z linuksem archaicznym będzie to dotyczyć Pythona 3.2.3, a na komputerze z redhat linkiem będzie to python 2.4.

+4

Wspaniały zapytania. Zauważ, że zalecana praktyka (zgodnie z PEP-394) sugeruje, że python2.x jest dowiązany symbolicznie jako 'python2', tak naprawdę jest to rodzaj problemu związanego z pakowaniem w imieniu redhat (w odróżnieniu od innych dystrybucji). – WhyNotHugo

+2

Dlaczego nie możesz zdefiniować nowej zmiennej na każdym komputerze, który będzie łączył się z python2.7.3? lub po prostu link? – slallum

+2

Zawsze możesz użyć 'python2.7.3 my-program.py' :) – Shaung

Odpowiedz

5

Możesz napisać mały skrypt otoki, który przegląda różne wersje plików wykonywalnych Pythona i używa tego, który znajduje.

Na przykład:

#!/bin/sh -e 
pythons=('python2', 'python2.7.3') 
for py_exec in ${pythons[@]}; do 
    py_exec="/usr/bin/$py_exec" 
    if [[ -f $py_exec ]]; then 
     exec $py_exec $1 
    fi 
done 

Oczywiście ten skrypt jest tylko próbka start, na pewno można poprawić na wiele sposobów. Po prostu daj pojęcie o co mi chodzi.

6
#!/bin/sh 
# -*- mode: Python -*- 

""":" 
# bash code here; finds a suitable python interpreter and execs this file. 
# prefer unqualified "python" if suitable: 
python -c 'import sys; sys.exit(not (0x020500b0 < sys.hexversion < 0x03000000))' 2>/dev/null \ 
    && exec python "$0" "[email protected]" 
for pyver in 2.6 2.7 2.5; do 
    which python$pyver > /dev/null 2>&1 && exec python$pyver "$0" "[email protected]" 
done 
echo "No appropriate python interpreter found." >&2 
exit 1 
":""" 

import sys 
print sys.version 

zaczerpnięte z https://github.com/apache/cassandra/blob/trunk/bin/cqlsh

Powiązane problemy