Ben teorik olarak çeşitli ortamlar (ve PATHs) ve çeşitli Linux sistemleri üzerinde çeşitli kullanıcılar tarafından çalıştırılabilir bir Python komut dosyası var ilginç bir durumdayım. Bu komut dosyası, yapay kısıtlamalar olmadan mümkün olduğunca çok üzerinde çalıştırılabilir olmasını istiyorum. İşte bilinen bazı kurulumlar:
- Python 2.6 sistem Python sürümüdür, bu nedenle python, python2 ve python2.6 / usr / bin dosyasında bulunur (ve eşdeğerdir).
- Python 2.6, yukarıdaki gibi sistem Python sürümüdür, ancak Python 2.7 yanında python2.7 olarak yüklenir.
- Python 2.4 betiğimin desteklemediği sistem Python sürümüdür. / Usr / bin dizininde eşdeğer olan python, python2 ve python2.4 ve betiğin desteklediği python2.5 var.
Bunların üçünde de aynı yürütülebilir python komut dosyasını çalıştırmak istiyorum. İlk önce /usr/bin/python2.7 kullanmaya çalışsaydı, eğer varsa /usr/bin/python2.6'ya, ardından /usr/bin/python2.5'e geri düşse, bunlardan hiçbiri yoksa hata yap. Bununla birlikte, eğer mevcutsa doğru tercümanlardan birini bulabildiği sürece, mümkün olan en son 2.x'i kullanarak fazla takılmadım.
İlk eğim, shebang hattını değiştirmekti:
#!/usr/bin/python
için
#!/usr/bin/python2.[5-7]
çünkü bu bash'da iyi çalışıyor. Ancak betiği çalıştırmak:
/usr/bin/python2.[5-7]: bad interpreter: No such file or directory
Tamam, bu yüzden bash'da da çalışan aşağıdakileri deniyorum:
#!/bin/bash -c /usr/bin/python2.[5-7]
Ama yine, bu başarısız olur:
/bin/bash: - : invalid option
Tamam, tabii ki doğru tercümanı bulan ve bulduğu herhangi bir tercümanı kullanarak python komut dosyasını çalıştıran ayrı bir kabuk komut dosyası yazabilirim. Ben sadece en güncel python 2 yorumlayıcı yüklü olarak çalıştırıldığı sürece yeterli olması gereken iki dosyayı dağıtmak için bir güçlük bulurdum. İnsanlardan tercümanı açıkça çağırmasını istemek (örn. $ python2.5 script.py
) Bir seçenek değildir. Kullanıcının PATH'in belirli bir şekilde kurulmasına güvenmek de bir seçenek değildir.
Düzenle:
Python komut içinde kontrol Sürüm edilir değil Python 2.6 itibariyle mevcut (ve 2.5 ile kullanılabilir "ile" deyimi kullanıyorum beri işe gidiş from __future__ import with_statement
). Bu, komut dosyasının kullanıcı dostu olmayan bir SyntaxError ile hemen başarısız olmasına neden olur ve ilk önce sürümü kontrol etme ve uygun bir hata yayınlama fırsatım olmasını engeller.
Örnek: (bunu 2.6'dan küçük bir Python yorumlayıcıyla deneyin)
#!/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
) python2.4'ün çalıştırılmasına neden olur, bu da kodunuzun yanlış sürüm olduğunu algılamasına neden olur (ve muhtemelen çıkılır). Ama bunun yerine tercüman olarak kullanılabilecek mükemmel bir python2.5 var!
exec
varsa, bir hata yazdırın.
execve
) değildir. Argümanlar string değişmezleri, globbing yok, regexps yok. Bu kadar. İlk arg "/ bin / bash" ve ikinci seçenekler ("-c ...") bile bu seçenekler bir kabuk tarafından ayrıştırılmaz. Bash yürütülebilir dosyasına işlenmemiş olarak teslim edilirler, bu yüzden bu hataları alırsınız. Ayrıca, shebang sadece başlangıçta ise çalışır. Yani burada şanssızsınız, korkuyorum (bir python tercümanı bulan ve korkunç bir karmaşaya benzeyen bir HERE dokümanı besleyen bir senaryo kısa).
import sys; sys.version_info()
, kullanıcının gerekli python sürümüne sahip olup olmadığını kontrol etmek için kullanabilirsiniz .