Powinienem umieścić #! (shebang) w skryptach Pythona, a jaką formę powinien przyjąć?

Czy powinienem umieścić shebang w moich skryptach Pythona? W jakiej formie?

#!/usr/bin/env python 

Lub

#!/usr/local/bin/python
Czy są równie przenośne? Która forma jest używana najczęściej?

uwaga: projekt tornado wykorzystuje shebang. Z drugiej strony projekt Django nie działa.

Author: Mike T, 2011-08-02

10 answers

Linia shebang w dowolnym skrypcie określa zdolność skryptu do wykonania jako samodzielny plik wykonywalny bez uprzedniego wpisania python w terminalu lub dwukrotnego kliknięcia go w menedżerze plików (jeśli jest poprawnie skonfigurowany). Nie jest to konieczne, ale zazwyczaj umieszcza się tam, więc gdy ktoś widzi plik otwarty w edytorze, od razu wie, na co patrzy. Jednak, której linii shebang używasz jest Ważne.

Poprawne użycie dla skryptów Pythona 3 jest:

#!/usr/bin/env python3

Domyślnie jest to wersja 3.najnowsze. Dla Pythona 2.7.Ostatnie użycie python2 zamiast python3.

Poniższe nie powinny być używane (z wyjątkiem rzadkiego przypadku, gdy piszesz kod, który jest kompatybilny zarówno z Pythonem 2.x i 3.x):

#!/usr/bin/env python

Powodem tych zaleceń, podanych w PEP 394 , jest to, że python może odnosić się do python2 lub python3 w różnych systemach. Obecnie odnosi się do python2 na większości dystrybucji, ale to może się kiedyś zmienić.

Nie stosować również:

#!/usr/local/bin/python

" python może być zainstalowany w /usr / bin / python lub / bin / python w tych przypadki, powyższe #! zawiedzie."

--"#!/ usr / bin / env python "vs"#!/usr / local/bin / python "

 739
Author: GlassGhost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 13:43:08

To tylko kwestia gustu. Dodanie shebang oznacza, że ludzie mogą wywoływać skrypt bezpośrednio, jeśli chcą (zakładając, że jest on oznaczony jako wykonywalny); pominięcie go oznacza tylko, że python musi być wywołane ręcznie.

Efekt końcowy uruchomienia programu nie ma wpływu w żaden sposób; to tylko opcje środków.

 66
Author: Amber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-02 06:39:30

Czy powinienem umieścić shebang w moich skryptach Pythona?

Umieść shebang w skrypcie Pythona, aby wskazać:

  • ten moduł może być uruchomiony jako skrypt
  • Czy można go uruchomić tylko na python2, python3 czy jest kompatybilny z Pythonem 2/3]}
  • w POSIX jest to konieczne, jeśli chcesz uruchomić skrypt bezpośrednio bez wywoływania python wykonywalnego jawnie
Czy są równie przenośne? Która forma jest używana większość?

Jeśli piszesz shebang ręcznie to Zawsze używaj #!/usr/bin/env python, chyba że masz konkretny powód, aby go nie używać. Ta forma jest rozumiana nawet w systemie Windows (Python launcher).

Uwaga: zainstalowane Skrypty powinny używać określonego pliku wykonywalnego Pythona, np. /usr/bin/python lub /home/me/.virtualenvs/project/bin/python. Jest źle, jeśli niektóre Narzędzia się zepsują, jeśli aktywujesz virtualenv w powłoce. Na szczęście prawidłowy shebang jest tworzony automatycznie w większości przypadków przez setuptools lub narzędzia pakietu dystrybucyjnego (w systemie Windows setuptools może automatycznie generować Skrypty wrapper .exe).

Innymi słowy, jeśli skrypt znajduje się w kasie źródłowej, prawdopodobnie zobaczysz #!/usr/bin/env python. Jeśli jest zainstalowany, to shebang jest ścieżką do konkretnego pliku wykonywalnego Pythona, takiego jak #!/usr/local/bin/python (uwaga: nie powinieneś ręcznie zapisywać ścieżek z tej drugiej kategorii).

Aby wybrać, czy należy używać python, python2, lub python3 w shebang, zobacz PEP 394-polecenie "python" na uniksopodobnych Systemy :

  • ... python powinny być używane w linii shebang tylko dla skryptów, które są źródło zgodne zarówno z Pythonem 2 jak i 3.

  • W przygotowaniu do ewentualnej zmiany domyślnej wersji Python, Python 2 tylko skrypty powinny być aktualizowane jako źródło kompatybilny z Pythonem 3 lub użyć python2 w linii shebang.

 21
Author: jfs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-12 09:54:02

Jeśli masz więcej niż jedną wersję Pythona i skrypt musi działać pod określoną wersją, she-bang może zapewnić, że odpowiednia wersja jest używana, gdy skrypt jest wykonywany bezpośrednio, na przykład:

#!/usr/bin/python2.7

Uwaga skrypt może być nadal uruchamiany przez pełną linię poleceń Pythona lub przez import, w którym to przypadku she-bang jest ignorowany. Ale dla skryptów uruchamianych bezpośrednio, jest to przyzwoity powód, aby użyć she-bang.

#!/usr/bin/env python jest generalnie lepszym podejściem, ale pomaga to w szczególne przypadki.

Zazwyczaj lepiej byłoby stworzyć wirtualne środowisko Pythona, w którym to przypadku generic #!/usr/bin/env python określiłby poprawną instancję Pythona dla virtualenv.

 14
Author: Chris Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-01 01:23:21

Należy dodać shebang, jeśli skrypt ma być wykonywalny. Powinieneś również zainstalować skrypt z oprogramowaniem instalacyjnym, które modyfikuje shebang do czegoś poprawnego, aby działał na platformie docelowej. Przykładem tego jest distutils i Distribute.

 10
Author: Lennart Regebro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-02 07:42:26

Celem shebang jest, aby skrypt rozpoznał Typ interpretera, gdy chcesz wykonać skrypt z powłoki. W większości przypadków, i nie zawsze, wykonujesz Skrypty dostarczając interpreter zewnętrznie. Przykład użycia: python-x.x script.py

To zadziała, nawet jeśli nie masz shebang declarator.

Pierwszy z nich jest bardziej "przenośny", ponieważ /usr/bin/env zawiera deklarację PATH, która zawiera wszystkie miejsca docelowe, w których wykonywalny jest Twój system / align = "left" /

Uwaga: Tornado nie używa ściśle shebangs, a Django ściśle nie. zależy to od tego, jak wykonujesz główną funkcję Twojej aplikacji.

Również: nie różni się od Pythona.

 8
Author: meson10,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-29 11:57:02

Czasami, jeśli odpowiedź nie jest bardzo jasna (mam na myśli, że nie możesz zdecydować, czy tak, czy nie), to nie ma to zbyt dużego znaczenia i możesz zignorować problem, dopóki odpowiedź nie będzie jasna.

Jedynym celem #! jest uruchomienie skryptu. Django ładuje źródła samodzielnie i używa ich. Nigdy nie trzeba decydować, jakiego interpretera należy użyć. W ten sposób #! nie ma tu sensu.

Ogólnie, jeśli jest to moduł i nie może być używany jako skrypt, nie ma potrzeby używania #!. Z drugiej strony, źródło modułów często zawiera if __name__ == '__main__': ... z co najmniej trywialnymi testami funkcjonalności. Wtedy #! znów ma sens.

Dobrym powodem używania #! jest używanie zarówno skryptów Pythona 2, jak i Pythona 3-muszą one być interpretowane przez różne wersje Pythona. W ten sposób musisz pamiętać, czego python należy użyć podczas ręcznego uruchamiania skryptu (bez #! wewnątrz). Jeśli masz mieszankę takich skryptów, dobrym pomysłem jest użycie #! wewnątrz, uczynienie ich wykonywalnymi i uruchomienie ich jako plików wykonywalnych (chmod ...).

Podczas korzystania z MS-Windows, #! nie miał sensu -- do niedawna. Python 3.3 wprowadza Windows Python Launcher (py.exe i pyw.exe), który odczytuje linię #!, wykrywa zainstalowane wersje Pythona i używa poprawnej lub wyraźnie żądanej wersji Pythona. Ponieważ rozszerzenie może być powiązane z programem, można uzyskać podobne zachowanie w systemie Windows, jak w przypadku flagi execute w systemach uniksowych.

 7
Author: pepr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-30 07:52:16

Kiedy ostatnio zainstalowałem Pythona 3.6.1 na Windows 7, zainstalowałem również program uruchamiający Pythona dla Windows, który ma obsługiwać linię shebang. Jednak okazało się, że program uruchamiający Pythona tego nie zrobił: linia shebang została zignorowana, a Python 2.7.13 był zawsze używany (chyba że wykonałem skrypt używając py -3).

Aby to naprawić, musiałem edytować klucz rejestru systemu Windows HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command. To nadal miało wartość

"C:\Python27\python.exe" "%1" %*

Z mojej wcześniejszej instalacji Pythona 2.7. Zmodyfikowałem to wartość klucza rejestru do

"C:\Windows\py.exe" "%1" %*

I przetwarzanie linii Pythona launchera shebang działało jak opisano powyżej.

 2
Author: ETalbot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-02 01:40:09

Odpowiedź: Tylko jeśli planujesz zrobić z niego skrypt wykonywalny z linii poleceń.

Oto procedura:

Zacznij od sprawdzenia WŁAŚCIWEGO ciągu shebang do użycia:

which python

Weź wyjście z tego i dodaj je (za pomocą shebang #!) w pierwszej linii.

Na moim systemie odpowiada Tak:

$which python
/usr/bin/python

Więc twój shebang będzie wyglądał tak:

#!/usr/bin/python

Po zapisaniu, nadal będzie działać jak wcześniej, ponieważ python zobaczy pierwszą linię jako skomentuj.

python filename.py

Aby zrobić z niego polecenie, skopiuj je, aby upuścić rozszerzenie .py.

cp filename.py filename

Powiedz systemowi plików, że będzie to wykonywalne:

chmod +x filename

Aby go przetestować, użyj:

./filename

Najlepszą praktyką jest przeniesienie go gdzieś w ścieżce $, więc wystarczy wpisać nazwę pliku.

sudo cp filename /usr/sbin

W ten sposób będzie działać wszędzie (bez/ przed nazwą pliku)

 2
Author: SDsolar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-08 01:51:32

Użyj najpierw

which python

To da wyjście jako miejsce, w którym znajduje się mój interpreter Pythona (binarny).

Wyjście To może być dowolne, np.

/usr/bin/python

Lub

/bin/python

Teraz odpowiednio wybierz linię shebang i użyj jej.

Do uogólnienia możemy użyć:

#!/usr/bin/env

Lub

#!/bin/env
 -2
Author: frp farhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-10 16:09:11