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.
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 "
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.
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.
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.
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.
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.
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.
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.
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)
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
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