2013-05-14 14 views
7

Mam canonical shebang na górze moich skryptów python.Czy jest możliwe dołączanie opcji wiersza poleceń w pythonie?

#!/usr/bin/env python 

Ja jednak nadal często chcą eksportować niebuforowanego wyjście do pliku dziennika, kiedy uruchomić moje skrypty, więc kończy się wywołaniem:

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

mogę osadzić opcji -u w shebang jak tak ...

#!/usr/bin/env python -u 

i tylko wezwanie:

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

... aby nadal korzystać z niebuforowania? Podejrzewam, że to nie zadziała, i chcesz to sprawdzić przed próbą. Czy jest coś, co to może osiągnąć?

+0

Tak, powinieneś. "Shebang" jest jedynie wskaźnikiem do binarnej aplikacji odpowiedzialnej za skrypt. Jeśli nie, możesz utworzyć alias 'alias ppython =" python -u "' i po prostu użyć '#!/Usr/bin/env ppython' – Torxed

+0

Możesz to zrobić. – aestrivex

+1

Torxed, czy próbowałeś odpowiedzi? Takie podejście nie działa w systemach OSX i Linux. Jeśli działa w twoim systemie operacyjnym, proszę podziel się szczegółami, ponieważ byłoby to interesujące. Powodem, dla którego nie działa on w OSX lub Linux (lub wierzę, każdy smak unixu) jest to, że 'env' wyszukuje plik wykonywalny na ścieżce, a aliasy nie znajdują się na ścieżce. Aliasy nie działają na linii Shebang w ten sam sposób iz tego samego powodu, dla którego wbudowane nie działają na linii Shebang. Jeśli twój system pozwala na to, proszę udostępnij! –

Odpowiedz

9

Możesz mieć argumenty na linii Shebang, ale większość systemów operacyjnych ma bardzo małe ograniczenie liczby argumentów. POSIX wymaga tylko jednego argumentu, który jest obsługiwany, a to jest typowe, w tym Linux.

Ponieważ używasz polecenia /usr/bin/env, używasz już jednego argumentu z python, więc nie możesz dodać kolejnego argumentu -u. Jeśli chcesz korzystać z python -u, musisz bezwzględnie zakodować ścieżkę bezwzględną do python zamiast używać /usr/bin/env, np.

#!/usr/bin/python -u 

Zobacz ten powiązane pytanie: How to use multiple arguments with a shebang (i.e. #!)?

+0

Dzięki. Wyglądało to dość łatwo, ale wiedziałem, że będzie jakiś haczyk. =) Czy jest ktoś głęboko w sercach wymagań POSIX? Czy mogę wysłać e-mail z informacją o tym, jak wielka byłaby ta funkcja, gdyby można było poprzeć więcej niż jeden argument? – Mittenchops

+1

Prawdopodobnie nie. Tak to zawsze działało, a POSIX zwyczajnie standaryzował istniejące zachowanie.Nawet jeśli zmieniłyby POSIX, musielibyśmy poczekać lata, aby przeprojektowano wystarczającą ilość implementacji, aby można było z niej korzystać przenośnie. – Barmar

3

przenośny sposób to zrobić, aby utworzyć inny plik wykonywalny, który przedstawia swoje możliwości.

Na przykład, umieścić ten plik na swojej drodze i nazwać go upython, i uczynić go wykonywalnym:

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

... używając opcji co trzeba. Następnie skrypt myscript.py może być tak:

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

Torxed zaproponował robi to poprzez alias powłoki. Byłbym bardzo zaskoczony, gdyby działało to w dowolnej wersji systemu Unix. Nie działa w kilku testowanych dystrybucjach. Moje podejście będzie działać w każdym unixie.

+0

ps: i właściwym sposobem przekazywania argumentów cmdline do innego skryptu lub funkcji jest użycie cytowanego '" $ @ "' (a po prostu '$ @'), ponieważ bez cudzysłowów argumenty spacjami zostaną rozbite. (I tu nieco o aliasach jest absolutnie poprawny.Nie będzie działać.) Na koniec, polecam nigdy nie używać 'env bash', ale raczej używając ścieżki do' bash' (np. '#!/Bin/bash ') bezpośrednio. Python jest problematyczny, na pewno. Bash, nie tak bardzo. Większym problemem w/bash jest w rzeczywistości przypadkowe użycie niewłaściwego, po udoskonaleniu 'PATH', aby użyć innych narzędzi (python, make itp.). – michael

+0

@michael_n: zgodziłem się na cytaty, zaktualizowałem –

+0

Dla takich skryptów wrapperów lubię wstawiać "exec", więc opakowanie nie pojawia się już na liście procesów. Na przykład "exec python -u -and -other ...." –

Powiązane problemy