Shebang'ı #!/usr/bin/env python
bir betiği çalıştırmak python
için kullandığımda , sistem hangisinin kullanılacağını nasıl biliyor ? python
Ortam değişkenlerinde bir bin yolu ararsam hiçbir şey bulamam.
env | grep -i python
Shebang'ı #!/usr/bin/env python
bir betiği çalıştırmak python
için kullandığımda , sistem hangisinin kullanılacağını nasıl biliyor ? python
Ortam 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/bin
diğer konum veya her yerde.
kullanma env
#!/usr/bin/env python
taşınabilir bir yolun OS'ye python
ilk 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 python
içinde /usr/bin
bazı makinelerde ve /usr/local/bin
diğerleri üzerinde? Ya da ayarlamak istediğiniz PATH
için /home/joe/opt/python-2.5/bin
o kadar Python belirli bir sürümünü kullanmak kadar? Çekirdek PATH
sizin 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-command
bağımsız değişken olarak bir yürütülebilir adını alıp bunu aramak gerekir PATH
ve çalıştırmak: Çekirdek çalışacaktır /fixed/path/to/path-lookup-command python /path/to/script
. Olduğu gibi, env
komut 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 env
yı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
env
ve 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.
env
aslı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.path
aktif 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 .