2013-05-14 7 views
7

Benim python betikleri üstünde canonical shebang var.Python shebang'da komut satırı seçeneklerini eklemek mümkün mü?

#!/usr/bin/env python 

Ancak, ben yine de sık sık benim komut dosyalarını çalıştırmak bir günlük dosyasına tamponsuz çıkışını ihraç etmek istiyorum, bu yüzden aradığını sona:

$ python -u myscript.py &> myscript.out & 

ben shebang içinde -u seçeneği gömmek Can gibi pek ...

#!/usr/bin/env python -u 

ve tek çağrı:

$ ./myscript.py &> myscript.out & 

... hala arabelleği kaldırmak için mi? Bunun işe yaramayacağından şüpheleniyorum ve denemeden önce kontrol etmek istiyorum. Bunu başarabilecek bir şey var mı?

+0

Evet, yapmalısınız. "Shebang", yalnızca betiğin sorumluluğunda olan ikili uygulamaya işaret eder. Eğer bir takma ad takma ppython = "python -u" 'oluşturabilir ve sadece' #!/Usr/bin/env ppython' – Torxed

+0

kullanabilirsiniz. Bunu yapabilirsiniz. – aestrivex

+1

Torxed, cevabını denedin mi? Bu yaklaşım OSX veya Linux'ta çalışmaz. İşletim sisteminizde çalışıyorsa, ayrıntıları paylaştığından lütfen ayrıntıları paylaşın. OSX veya Linux'ta çalışmama nedeni (veya inanıyorum ki, herhangi bir unix çeşidi) 'env' yoldaki bir yürütülebilir dosyayı arar ve diğer adlar yol üzerinde değildir. Takma adlar, shebang hattında aynı şekilde ve aynı nedenle, yerleşiklerin shebang hattında çalışmadığı anlamına gelmez. OS'niz buna izin veriyorsa, lütfen paylaşın! –

cevap

9

Shebang satırında bağımsız değişkenler olabilir, ancak çoğu işletim sisteminin argüman sayısı üzerinde çok küçük bir sınırı vardır. POSIX sadece bir argümanın desteklenmesini gerektirir ve bu Linux da dahil olmak üzere yaygındır.

/usr/bin/env komutunu kullandığınızdan, python numaralı bir bağımsız değişkeni zaten kullanıyorsunuz, bu nedenle başka bir bağımsız değişken ekleyemezsiniz -u. python -u'u kullanmak isterseniz, /usr/bin/env kullanmak yerine mutlak yolun python kodunu kodlamanız gerekir. How to use multiple arguments with a shebang (i.e. #!)?

+0

Teşekkürler. Yeterince kolay görünüyordu, ama bir yakalama olacağını biliyordum. =) POSIX gereksinimlerinin bağırsaklarında derin bir kişi var mı, bu özelliği birden fazla argümanı desteklemek mümkün olsaydı ne kadar harika olacağı hakkında konuşmak için bir e-posta gönderebilirim? – Mittenchops

+1

Muhtemelen hayır. Bu, her zaman nasıl çalıştı ve POSIX sadece mevcut davranışları standartlaştırdı.POSIX'i değiştirdiyseler bile, yeniden tasarlanabilmeniz için yıllarca beklemek zorunda kalacaksınız. – Barmar

3

Bunu yapmanın taşınabilir yolu seçenekleri barındırıyor başka yürütülebilir oluşturmaktır:

#!/usr/bin/python -u 

bu ilgili soruya bakın.

Örneğin, yolda bu dosyayı koymak ve bunu upython isim ve çalıştırılabilir yapın:

#!/usr/bin/env bash 
python -u -and -other -options "[email protected]" 

... Eğer gerekiyorsa tüm seçenekleri kullanarak. Sonra myscript.py komut dosyası aşağıdaki gibi olabilir: Torxed bir kabuk takma yoluyla bunu önerdi

#!/usr/bin/env upython 
(... your normal Python code ...) 

. Unix'in herhangi bir sürümünde çalışsaydı çok şaşırırım. Test ettiğim birkaç dağıtımda işe yaramıyor. Benim yaklaşımım herhangi bir unixte çalışacaktır.

+0

ps: ve cmdline args komutunu başka bir betiğe veya işleve iletmenin uygun yolu, bir "" $ @ "' (yani sadece $ $ ') kullanıyor, çünkü tırnak işaretleri olmadan, boşluklarla birlikte boşluklar bozuluyor. (Ve buradaki takma isimler kesinlikle doğru. İşe yaramayacak.) Son olarak, env bash'ı asla kullanmamanızı, daha ziyade “bash” yolunu kullanmanızı tavsiye ederim (örneğin, '#!/Bin/bash ') doğrudan. Python emin olmak için sorunludur. Bash, o kadar değil. W/bash'ın daha büyük problemi, yanlışlıkla “yanlış” olanı kullanarak, başka bir takım (python, make, vb.) Kullanmak için “PATH” yi değiştirdikten sonra. – michael

+0

@michael_n: –

+0

hakkında alıntılar üzerinde anlaşmaya varıldı. Bunun gibi sarmalayıcı komut dosyaları için "exec" yazmayı seviyorum, böylece sarıcı artık işlem listesinde görünmez. I.e., "exec python -u -ve -other ...." –