Czy powinienem umieścić shebang w moich skryptach Python? W jakiej formie
#!/usr/bin/env python
lub
#!/usr/local/bin/python
Czy są one równie przenośne? Która forma jest najczęściej używana?
Uwaga: tornado projekt wykorzystuje shebang. Z drugiej stronyprojekt Django tego nie robi.
python
shell
python-3.x
shebang
treecoder
źródło
źródło
#!/usr/bin/python
porównanie z pierwszą opcją? Widzę to w dość przykładowym kodzie. Edycja: Może to jest odpowiedź .. stackoverflow.com/a/2429517/1156245Odpowiedzi:
Linia shebang w dowolnym skrypcie określa zdolność skryptu do wykonania jak samodzielny plik wykonywalny bez
python
wcześniejszego wpisywania w terminalu lub po dwukrotnym kliknięciu go w menedżerze plików (przy prawidłowej konfiguracji). Nie jest to konieczne, ale zazwyczaj umieszczane tam, więc gdy ktoś zobaczy plik otwarty w edytorze, natychmiast wie, na co patrzy. Ważne jest jednak to, która linia shebang jest używana .Prawidłowe użycie skryptów Python 3 to:
Domyślnie jest to wersja 3. najnowsza. Dla Python 2.7. Ostatnie użycie
python2
zamiastpython3
.Poniższe NIE powinno być używane (z wyjątkiem rzadkiego przypadku pisania kodu, który jest zgodny zarówno z Pythonem 2.x, jak i 3.x):
Powodem tych zaleceń, podanych w PEP 394 , jest właśnie to
python
mogą odnosić się do różnych systemówpython2
lubpython3
do różnych systemów. Obecnie dotyczypython2
większości dystrybucji, ale w pewnym momencie może się to zmienić.NIE NALEŻY również używać:
- "#! / usr / bin / env python" vs "#! / usr / local / bin / python"
źródło
/usr/bin
to jak możesz być pewien, żeenv
zostanie on znaleziony/usr/bin
. Jeśli Python jest zainstalowany w niestandardowym miejscu, prawdopodobnie oznacza to, że Python jest skonfigurowany w niestandardowy sposób i w rezultacie skrypt powinien szybko zawieść. W przeciwieństwie do przyjmowania założeń dotyczących właściwości interpretera języka Python i liczenia na najlepsze.env
będzie zawsze znaleźć w/usr/bin/
, a jej zadaniem jest zlokalizowanie kosze (jak pyton) przy użyciuPATH
. Bez względu na to, jak jest zainstalowany Python, jego ścieżka zostanie dodana do tej zmiennej ienv
znajdzie ją (jeśli nie, Python nie zostanie zainstalowany). To jest pracaenv
, i to jest cały powód, dla którego istnieje. Jest to rzecz, która ostrzega środowisko (konfiguruje zmienne env, w tym ścieżki instalacji i zawiera ścieżki). Ludzie zawsze rozumieli, że to polecenie może działać tylko wtedy, gdy zawsze znajduje się w tym samym miejscu. To tylko dane/usr/bin/env
nie jest gwarantowane przez żaden inny standard niż powszechnie przyjęta (powszechnie?) Reguła ...python
plik wykonywalny powinien być używany tylko wtedy, gdy skrypt jest zgodny z Python 2 i Python 3. W przeciwnym razie powinien wskazywać odpowiedni wybór zpython2
ipython3
.To naprawdę tylko kwestia gustu. Dodanie shebang oznacza, że ludzie mogą bezpośrednio wywoływać skrypt, jeśli chcą (zakładając, że jest oznaczony jako wykonywalny); pominięcie tego oznacza po prostu, że
python
należy wywoływać ręcznie.Na wynik końcowy uruchomienia programu nie ma to wpływu; to tylko opcje środków.
źródło
chmod a+x [your-script].py
powinno sprawić, że będzie on wykonywalny, a następnie można po prostu wywołać./[your-script.py]
w powłoce.Umieść shebang w skrypcie Python, aby wskazać:
python
jawnego wywoływania pliku wykonywalnegoJeśli piszesz shebang ręcznie, zawsze używaj go,
#!/usr/bin/env python
chyba że masz konkretny powód, aby go nie używać. Ten formularz jest zrozumiały nawet w systemie Windows (program uruchamiający w języku Python).Uwaga: zainstalowane skrypty powinny używać określonego pliku wykonywalnego Pythona, np .
/usr/bin/python
Lub/home/me/.virtualenvs/project/bin/python
. Źle, jeśli jakieś narzędzie się zepsuje, jeśli aktywujesz virtualenv w swojej powłoce. Na szczęście poprawny shebang jest tworzony automatycznie w większości przypadków przezsetuptools
narzędzia pakietu dystrybucyjnego (w systemie Windowssetuptools
można wygenerować opakowanie).exe
automatycznie skrypty ).Innymi słowy, jeśli skrypt znajduje się w kasie źródłowej, prawdopodobnie zobaczysz
#!/usr/bin/env python
. Jeśli jest zainstalowany, shebang jest ścieżką do określonego pliku wykonywalnego Pythona, takiego jak#!/usr/local/bin/python
(UWAGA: nie należy ręcznie pisać ścieżek z tej drugiej kategorii).Aby wybrać, czy chcesz używać
python
,python2
czypython3
w trybie shebang, zobacz PEP 394 - Polecenie „python” w systemach uniksopodobnych :źródło
#!/usr/bin/env python
siebie?#!/usr/bin/env python
. Nie sugeruj „zawsze używaj”#!/usr/bin/env python
. Jest to niewłaściwe postępowanie w 99% przypadków (powód, który podałeś w odpowiedzi).Jeśli masz więcej niż jedną wersję Pythona, a skrypt musi działać pod określoną wersją, she-bang może zapewnić, że odpowiedni jest używany, gdy skrypt jest wykonywany bezpośrednio, na przykład:
Uwaga: skrypt nadal może być uruchamiany za pomocą pełnego wiersza polecenia Python lub importu, w którym to przypadku she-bang jest ignorowana. Ale w przypadku skryptów uruchamianych bezpośrednio jest to dobry powód, aby używać she-bang.
#!/usr/bin/env python
jest ogólnie lepszym podejściem, ale pomaga to w szczególnych przypadkach.Zwykle lepiej byłoby ustanowić wirtualne środowisko Python, w którym to przypadku rodzajowa
#!/usr/bin/env python
zidentyfikowałaby poprawną instancję Pythona dla virtualenv.źródło
which
da ci ciąg, który będzie działać, kropka. Nie musisz się martwić o odwagę, aby z niej skorzystać.Powinieneś dodać shebang, jeśli skrypt ma być wykonywalny. Powinieneś także zainstalować skrypt z oprogramowaniem instalacyjnym, które modyfikuje shebang do czegoś poprawnego, aby działał na platformie docelowej. Przykładami tego są distutils i Distribution.
źródło
which
automatycznie wybierze wartość domyślną używaną przez polecenia systemowe i tym podobne. Jest ogólny, a system steruje nim do właściwej instalacji.Funkcja shebang ma na celu rozpoznanie przez skrypt typu interpretera, gdy skrypt ma zostać wykonany z powłoki. Przeważnie i nie zawsze wykonujesz skrypty, dostarczając interpretera na zewnątrz. Przykładowe użycie:
python-x.x script.py
To zadziała, nawet jeśli nie masz deklaratora shebang.
Dlaczego pierwszy jest bardziej „przenośny”, ponieważ
/usr/bin/env
zawiera twójPATH
deklarację, która uwzględnia wszystkie miejsca docelowe, w których znajdują się pliki wykonywalne systemu.UWAGA: Tornado nie stosuje wyłącznie shebangów, a Django nie. Różni się w zależności od sposobu wykonywania głównej funkcji aplikacji.
RÓWNIEŻ: Nie zmienia się w Pythonie.
źródło
Czasami, jeśli odpowiedź nie jest bardzo jasna (to znaczy nie możesz zdecydować, czy tak, czy nie), to nie ma to większego 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 musi decydować, jakiego tłumacza należy użyć. W ten sposób#!
nie ma tu sensu.Zasadniczo, jeśli jest to moduł i nie można go użyć jako skryptu, nie ma potrzeby używania
#!
. Z drugiej strony źródło modułu często zawieraif __name__ == '__main__': ...
przynajmniej trywialne testy funkcjonalności. To znów#!
ma sens.Jednym z dobrych powodów
#!
jest użycie zarówno skryptów Python 2, jak i Python 3 - muszą one być interpretowane przez różne wersje Pythona. W ten sposób musisz pamiętać, z czegopython
należy korzystać podczas ręcznego uruchamiania skryptu (bez jego#!
wnętrza). Jeśli masz wiele takich skryptów, dobrym pomysłem jest skorzystanie z ich#!
wnętrza, uczynienie ich wykonywalnymi i uruchomienie ich jako plików wykonywalnych (chmod ...).Podczas korzystania z MS-Windows
#!
nie miało to sensu - do niedawna. Python 3.3 wprowadza Windows Python Launcher (py.exe i pyw.exe), który odczytuje#!
wiersz, wykrywa zainstalowane wersje Pythona i używa poprawnej lub wyraźnie pożądanej wersji Pythona. Ponieważ rozszerzenie może być powiązane z programem, możesz uzyskać podobne zachowanie w systemie Windows, jak w przypadku flagi wykonania w systemach uniksowych.źródło
Kiedy ostatnio zainstalowałem Python 3.6.1 na Windows 7, zainstalowałem także Python Launcher dla Windows, który powinien obsługiwać linię shebang. Odkryłem jednak, że Launcher Python tego nie zrobił: linia shebang została zignorowana, a Python 2.7.13 był zawsze używany (chyba że wykonałem skrypt za pomocą py -3).
Aby to naprawić, musiałem edytować klucz rejestru systemu Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command
. To wciąż miało wartośćz mojej wcześniejszej instalacji Python 2.7. Zmodyfikowałem tę wartość klucza rejestru na
a przetwarzanie linii shebang w Python Launcher działało jak opisano powyżej.
źródło
Jeśli masz zainstalowane różne moduły i musisz użyć konkretnej instalacji Pythona, wtedy shebang wydaje się początkowo ograniczony. Możesz jednak wykonać takie sztuczki, jak poniżej, aby najpierw wywołać szewang jako skrypt powłoki, a następnie wybrać python. To jest bardzo elastyczne imo:
A może jeszcze lepiej, aby ułatwić ponowne użycie kodu w wielu skryptach Pythona:
a następnie select.sh ma:
źródło
Odpowiedź: Tylko jeśli planujesz uczynić go skryptem wykonywalnym z linii poleceń.
Oto procedura:
Zacznij od sprawdzenia poprawności łańcucha shebang, którego chcesz użyć:
Weź z tego wynik i dodaj go (z shebang #!) W pierwszym wierszu.
W moim systemie odpowiada tak:
Twój shebang będzie wyglądał następująco:
Po zapisaniu nadal będzie działał jak poprzednio, ponieważ python zobaczy pierwszy wiersz jako komentarz.
Aby ustawić polecenie, skopiuj je, aby upuścić rozszerzenie .py.
Poinformuj system plików, że będzie to możliwe do wykonania:
Aby to przetestować, użyj:
Najlepszą praktyką jest przeniesienie go gdzieś w $ PATH, więc wystarczy wpisać nazwę pliku.
W ten sposób będzie działać wszędzie (bez ./ przed nazwą pliku)
źródło
Ścieżka absolutna vs logiczna:
To jest naprawdę pytanie o to, czy ścieżka do interpretera Pythona powinna być bezwzględna, czy logiczna (
/usr/bin/env
) w odniesieniu do przenośności.Napotykając inne odpowiedzi na tej i innych stronach stosu, które mówiły o tym problemie w sposób ogólny, bez poparcia dowodów, przeprowadziłem naprawdę, NAPRAWDĘ , szczegółowe testy i analizy tego właśnie pytania na unix.stackexchange.com . Zamiast wkleić tę odpowiedź tutaj, skieruję osoby zainteresowane analizą porównawczą do tej odpowiedzi:
https://unix.stackexchange.com/a/566019/334294
Będąc inżynierem systemu Linux, moim celem jest zawsze zapewnienie najbardziej odpowiednich, zoptymalizowanych hostów dla moich klientów programistów, więc kwestia środowisk Python była czymś, na co naprawdę potrzebowałem solidnej odpowiedzi. Mój pogląd po testach był taki, że logiczna ścieżka w She-Bang była lepsza z (2) opcji.
źródło
Użyj najpierw
To da wynik jako lokalizację, w której obecny jest mój interpreter Pythona (binarny).
Ten wynik może być dowolny, na przykład
lub
Teraz odpowiednio wybierz linię shebang i użyj jej.
Do uogólnienia możemy użyć:
lub
źródło
#!/usr/bin/env
dokonuje właściwego wyboru dla Ciebie.which
polecenia - zwróci prawidłowy ciąg znaków dla twojego konkretnego systemu.which python
ponownie i zmieniasz skrypt, jeśli wynik różni się od bieżącego shebang