2012-08-22 21 views
14

Tôi gặp sự cố khi cố gắng chạy tập lệnh python trên hai máy tính khác nhau. Trên mỗi máy tính tôi muốn chạy kịch bản bằng python phiên bản 2.7.3 tuy nhiên vấn đề tôi gặp phải là hai máy tính có tên python 2.7.3 theo nhiều cách khác nhau. Một trong những máy tính chạy Linux và trên máy tính này, nó được đặt tên là python2. Máy tính khác đang chạy redhat linux và nó sử dụng tên python2.7.3.Dòng shebang có điều kiện cho các phiên bản Python khác nhau

Tôi nên sử dụng gì trong dòng shebang để tập lệnh có thể thực thi trên cả hai máy tính mà không yêu cầu bất kỳ thay đổi nào? Điều tôi thực sự muốn là một số dòng shebang có điều kiện có thể chọn phiên bản Python nào cần sử dụng. Tôi chỉ là người may mắn và tôi phải giữ hai phiên bản khác nhau của kịch bản?

P.S. Tôi không thể chỉ sử dụng #!/Usr/bin/env python như trên máy tính Linux vòm này sẽ đề cập đến python 3.2.3 và trên máy tính Linux redhat nó sẽ đề cập đến python 2.4.

+4

Một câu hỏi tuyệt vời. Lưu ý rằng thực hành được đề nghị (theo PEP-394), gợi ý rằng python2.x được symlinked là 'python2', do đó, đây thực sự là vấn đề bao bì thay mặt cho redhat (amogst distro khác). – WhyNotHugo

+2

Tại sao bạn không thể xác định một biến mới trong mỗi máy tính sẽ liên kết đến python2.7.3? hoặc chỉ là một liên kết? – slallum

+2

Bạn luôn có thể sử dụng 'python2.7.3 my-program.py' :) – Shaung

Trả lời

5

Bạn có thể viết tập lệnh trình bao bọc nhỏ xem qua các phiên bản thực thi python khác nhau và sử dụng phiên bản tìm thấy.

Ví dụ:

#!/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 

Tất nhiên kịch bản này chỉ là một mẫu bắt đầu, bạn chắc chắn có thể cải thiện nó bằng nhiều cách. Chỉ cần cung cấp cho bạn một ý tưởng về những gì tôi có ý nghĩa.

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 

lấy từ https://github.com/apache/cassandra/blob/trunk/bin/cqlsh