Shebang'ı #!/usr/bin/env pythonbir betiği çalıştırmak pythoniçin kullandığımda , sistem hangisinin kullanılacağını nasıl biliyor ? pythonOrtam değişkenlerinde bir bin yolu ararsam hiçbir şey bulamam.
env | grep -i python
Shebang'ı #!/usr/bin/env pythonbir betiği çalıştırmak pythoniçin kullandığımda , sistem hangisinin kullanılacağını nasıl biliyor ? pythonOrtam değişkenlerinde bir bin yolu ararsam hiçbir şey bulamam.
env | grep -i python
Yanıtlar:
Shebang, aşağıdaki sözdiziminin yanlış olması için tercümanın kullanması için tam yol bekler:
#!python
Böyle bir tam yol ayarlamak işe yarayabilir:
#!/usr/local/bin/python
piton kurulabilir edebileceğiniz gibi ama sigara taşınabilir olacağını /bin, /opt/python/bindiğer konum veya her yerde.
kullanma env
#!/usr/bin/env python
taşınabilir bir yolun OS'ye pythonilk içinde bulunduğu yere eşdeğer bir tam yol belirlemesini sağlayan bir yöntemdir PATH.
Shebang ( “sivri patlama”, yani, satır #!) çekirdek tarafından işlenir. Çekirdek gibi çevre değişkenleri hakkında bilmek istemiyor PATH. Bu yüzden shebang satırındaki ad çalıştırılabilir bir yol olmalıdır. Ayrıca, komut dosyasından önce o yürütülebilir dosyaya geçmek için ek bir argüman belirleyebilirsiniz (sisteme bağlı kısıtlamalarla buraya girmeyeceğim). Örneğin, bir Python betiği için belirtebilirsiniz.
#!/usr/bin/python
ilk satırda ve betiği çalıştırdığınızda, çekirdek aslında yürütülür /usr/bin/python /path/to/script. Ancak bu uygun değildir: komutun tam yolunu belirtmeniz gerekir. Ne varsa pythoniçinde /usr/binbazı makinelerde ve /usr/local/bindiğerleri üzerinde? Ya da ayarlamak istediğiniz PATHiçin /home/joe/opt/python-2.5/bino kadar Python belirli bir sürümünü kullanmak kadar? Çekirdek PATHsizin için arama yapamayacağından, fikir, çekirdeğin istenen tercümana bakacağı bir komutu çalıştırmasını sağlamaktır PATH:
#!/fixed/path/to/path-lookup-command python
Bu path-lookup-commandbağımsız değişken olarak bir yürütülebilir adını alıp bunu aramak gerekir PATHve çalıştırmak: Çekirdek çalışacaktır /fixed/path/to/path-lookup-command python /path/to/script. Olduğu gibi, envkomut tam da bunu yapıyor. Asıl amacı, farklı bir çevreye sahip bir komut çalıştırmaktır, ancak komut adına baktığından $PATH, buradaki amacımız için mükemmeldir.
Bu resmen garanti olmasa da, tarihi Unix sistemleri temin envyılında /usr/bin, modern sistemler nedeniyle yaygın kullanımı tam da bu konumunu tutmuş #!/usr/bin/env. Bu nedenle, pratikte, bir betiğin kullanıcının en sevdiği Python yorumlayıcısı tarafından yürütülmesi gerektiğini belirtme yöntemi
#!/usr/bin/env python
envve arasında tercih edilir which? o zaman da PATH ortamımdan en uygun çalıştırılabilir dosyalara sahip olacaksınız.
whichçalıştırılabilir dosyayı bulur ve yolunu yazdırır. envİlk argüman tarafından belirtilen programı bulur ve kalan argümanları ileterek çalıştırır.
envaslında bir eval versiyonu which.
Tamam, koş o zaman:
env | grep PATH
$ PATH, bir dizin listesidir. Unix, "python" u bulunana kadar, bu dizinler listesinden geçecektir.
'Hangi' komutuyla hangi dizini bulduğunu görebilirsiniz:
which python
sys.pathaktif bir env $ env python3 ( ['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/.local/lib/python3.4/site-packages', '/usr/lib/python3.4/site-packages', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']) ve ./env/bin/python3 (['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/test/env3/lib/python3.4/site-packages']) arasında pitonda bir fark görüyorum .