Saya berada dalam sedikit situasi yang menarik di mana saya memiliki skrip Python yang secara teoritis dapat dijalankan oleh berbagai pengguna dengan berbagai lingkungan (dan PATH) dan pada berbagai sistem Linux. Saya ingin skrip ini dapat dieksekusi pada sebanyak mungkin dari ini tanpa batasan buatan. Berikut ini beberapa pengaturan yang diketahui:
- Python 2.6 adalah versi sistem Python, jadi python, python2, dan python2.6 semuanya ada di / usr / bin (dan setara).
- Python 2.6 adalah versi sistem Python, seperti di atas, tetapi Python 2.7 diinstal di sampingnya sebagai python2.7.
- Python 2.4 adalah versi sistem Python, yang tidak didukung skrip saya. Di / usr / bin kita memiliki python, python2, dan python2.4 yang setara, dan python2.5, yang didukung skrip.
Saya ingin menjalankan skrip python yang dapat dieksekusi yang sama pada ketiganya. Akan lebih baik jika mencoba menggunakan / usr/bin/python2.7 terlebih dahulu, jika ada, kemudian kembali ke /usr/bin/python2.6, kemudian kembali ke /usr/bin/python2.5, lalu cukup kesalahan jika tidak ada yang hadir. Saya tidak terlalu menutup telepon dengan menggunakan 2.x terbaru, asalkan bisa menemukan salah satu penerjemah yang tepat jika ada.
Kecenderungan pertama saya adalah mengubah garis shebang dari:
#!/usr/bin/python
untuk
#!/usr/bin/python2.[5-7]
karena ini berfungsi dengan baik di bash. Tetapi menjalankan skrip memberi:
/usr/bin/python2.[5-7]: bad interpreter: No such file or directory
Oke, jadi saya coba yang berikut ini, yang juga berfungsi di bash:
#!/bin/bash -c /usr/bin/python2.[5-7]
Tetapi sekali lagi, ini gagal dengan:
/bin/bash: - : invalid option
Oke, jelas saya hanya bisa menulis skrip shell terpisah yang menemukan penerjemah yang benar dan menjalankan skrip python menggunakan penerjemah apa pun yang ditemukannya. Saya hanya merasa kesulitan untuk mendistribusikan dua file di mana orang harus mencukupi selama itu dijalankan dengan interpreter python 2 yang paling up-to-date diinstal. Meminta orang untuk memohon penerjemah secara eksplisit (misalnya, $ python2.5 script.py
) bukanlah suatu pilihan. Mengandalkan PATH pengguna yang diatur dengan cara tertentu juga bukan pilihan.
Edit:
Pengecekan versi dalam skrip Python tidak akan berfungsi karena saya menggunakan pernyataan "with" yang ada pada Python 2.6 (dan dapat digunakan dalam 2.5 dengan from __future__ import with_statement
). Ini menyebabkan skrip gagal segera dengan SyntaxError pengguna-tidak ramah, dan mencegah saya dari memiliki kesempatan untuk memeriksa versi terlebih dahulu dan memancarkan kesalahan yang sesuai.
Contoh: (coba ini dengan penerjemah Python kurang dari 2,6)
#!/usr/bin/env python
import sys
print "You'll never see this!"
sys.exit()
with open('/dev/null', 'w') as out:
out.write('something')
./script.py
) akan menyebabkan python2.4 untuk mengeksekusinya, yang akan menyebabkan kode Anda mendeteksi bahwa itu adalah versi yang salah (dan berhenti, mungkin). Tapi ada python2.5 yang sangat bagus yang bisa digunakan sebagai penerjemah!
exec
jika demikian, cetak kesalahan.
execve
). Argumennya adalah string literal, tidak ada globbing, tidak ada regexps. Itu dia. Bahkan jika arg pertama adalah "/ bin / bash" dan opsi kedua ("-c ...") opsi tersebut tidak diuraikan oleh shell. Mereka tidak ditangani ke bash executable, itulah sebabnya Anda mendapatkan kesalahan tersebut. Plus, shebang hanya berfungsi jika sudah di awal. Jadi Anda kurang beruntung di sini, saya takut (pendek naskah yang menemukan juru bahasa python dan memberinya sebuah dokumen DI SINI, yang terdengar seperti kekacauan yang mengerikan).
import sys; sys.version_info()
untuk memeriksa apakah pengguna memiliki versi python yang diperlukan.