ve / usr / bin / env taşınabilirlik Python dağıtım

oy
12

Tüm yürütülebilir Python komut başında ben koymak mesele hattını:

#!/usr/bin/env python

Ben bir sistemde bu komut dosyalarını koşuyorum env pythonPython 2.2 ortamı verir. Ben uyumlu bir Python sürümü için bir manuel kontrol var çünkü benim komut hızla başarısız:

if sys.version_info < (2, 4):
    raise ImportError(Cannot run with Python version < 2.4)

Ben eğer mümkünse, her yürütülebilir dosya üzerinde shebang hattını değiştirmek zorunda kalmak istemiyoruz; ancak, sonucunu değiştirmek için makineye yönetim erişimi yok env pythonve ben gibi özel bir versiyonunu zorlamak istemiyorum:

#!/usr/bin/env python2.4

Sistem Python 2.4 den daha yeni bir sürümü olabilir veya Python 2.5 ama hiçbir Python 2.4 olabilir çünkü bu kaçınmak istiyorum.

zarif çözüm nedir?

[Düzenleme:] Ben sorusuyla buna yeterince spesifik değildi - Kullanıcıların elle yapılmaksızın komut dosyalarını yürütmek (örneğin yol değiştirilmesi veya sembolik bağlantılarını vermek istiyoruz ~/binve PATH sağlanması vardır ~/binPython 2.2 yolunun önce). Belki bazı dağıtım yarar manuel ince ayarları önlemek için gereklidir?

Oluştur 02/09/2008 saat 22:21
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
8

"Env" sadece bunu YOLU env var bulduğu ilk iş yürütür. Farklı piton geçmek için Senaryonu çağırmadan önce python'un yürütülebilir yoluna için dizin getirebilirsiniz.

Cevap 02/09/2008 saat 22:25
kaynak kullanıcı

oy
2

Eğer komut çalışıyorsa o zaman ilk özel bin dizinine işaret edecek şekilde YOL değişkeni ayarlayabilirsiniz:

$ mkdir ~/bin
$ ln -s `which python2.4` ~/bin/python
$ export PATH=~/bin:$PATH

Eğer python komut çalıştırdığınızda Sonra piton 2.4 kullanacağız. Eğer PATH değiştirmek için giriş komut değiştirmek gerekecek.

Alternatif istediğiniz açık tercüman ile piton komut dosyasını çalıştırın:

$ /path/to/python2.4 <your script>
Cevap 02/09/2008 saat 22:28
kaynak kullanıcı

oy
4

Oldukça hackish çözüm - çek durumunda, bunun kabul edilebilir olup olmadığını belirlemek, en iyi tercüman kullanılabilir belirlemek için (muhtemelen anlamlı geliştirilebilir) Bu fonksiyonu kullanmak ve böylece os.system veya benzer bir şey ve sys Senaryonu yeniden başlatın eğer. argv yeni tercüman kullanarak.

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]
Cevap 03/09/2008 saat 21:32
kaynak kullanıcı

oy
0

@morais: Bu ilginç bir fikir, ama biz bir adım daha uzağa alabilir belki düşünüyorum. Belki kullanmak için bir yolu var Ian Bicking en VIRTUALENV için:

  • biz başlamanın pek uygun bir ortamda çalıştırıyorsanız bakın, eğer öyleyse, hiçbir şey yapma.
  • Bir sürüme özgü yürütülebilir vardır olmadığını kontrol edin PATHolmadığını kontrol yani python2.xvar for x in reverse(range(4, 10)). Eğer öyleyse, daha iyi tercüman komutunu yeniden çalıştırın.
  • daha iyi bir tercüman varsa, herhangi bir önkoşul paketleri denemek ve Python eski sürümünden Python daha yeni bir sürümünü yüklemek ve almak için Virtualenv kullanın.

Virtualenv bu yeteneğinin olup olmadığını hiçbir fikrim yok, bu yüzden bazen yakında onunla etrafında karışıklık gidersiniz. :)

Cevap 04/09/2008 saat 00:07
kaynak kullanıcı

oy
0

Burada (1) kesinlikle shebangs kullanarak ve inşa sürecinde Autotools kullanmak (2) mümkün ayarlanmış eğer bir çözüm.

Sadece autoconf makro kullanabilirsiniz dün gece buldum AM_PATH_PYTHONminimal Python bulmak için 2 ikili. Nasıl yapılır ise burada .

Yani, süreç olacaktır:

  • Bir Sayı AM_PATH_PYTHON(2.4)içinde seninconfigure.ac
  • Senin tüm Rename .pyiçin komut .py.in(benim durumumda, bu karıştırmayın değil vi)
  • Birlikte üretmek isteyen Python komut tüm Ad AC_CONFIG_FILES.
  • Yerine ile başlayan #!/usr/bin/env python, kullanma#!@PYTHON@

Sonra çıkan Python komut daima uygun bir shebang sahip olacaktır.

pratik değilse Yani, en azından mümkün, bu çözümü var.

Cevap 04/10/2013 saat 19:27
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more