Ta odpowiedź omawia sposób uruchamiania wielowierszowego fragmentu kodu Pythona z wiersza poleceń w terminalu. Zauważyłem, że odpowiedź działa świetnie w skryptach powłoki, nawet w zagnieżdżonych wcięciach, co jest bardzo miłe, np
#!/bin/bash
some_text="Hello world"
echo $some_text
cat <<EOF | python -
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
drukuje:
0
hello
hello
1
hello
hello
2
hello
hello
Jednak trudno mi udostępniać zmienne między skryptem powłoki a fragmentem kodu w języku Python.
Jak mogę zebrać dane wyjściowe indeksu python w skrypcie bash? (np. w zmiennej takiej jak
$output
).Jak mogę przekazać zmienną bash (np.
$some_text
) Do skryptu Python?
python - <<EOF
zamiast tego zrobić .Odpowiedzi:
Uzyskiwanie zmiennej do Pythona
Ponieważ (gdy
EOF
znacznik nie jest cytowany) podstawienie zmiennej następuje przed przekazaniem tekstu z heredoc dopython
standardowego wejścia, można wrzucić zmienną bezpośrednio do skryptu.Jeśli
some_text
taktest
, python by to zobaczyłsome_text = "test"
. Należy jednak pamiętać, że można to postrzegać jako lukę w zabezpieczeniach polegającą na wstrzykiwaniu kodu. Jeślisome_text
było"; import os; os.system("evil-command"); x = "
, na przykład, pyton byłoby zobaczyć:i wykonujcie to złe polecenie.
Jeśli chcesz mieć możliwość ściągnięcia kodu Pythona bezpośrednio do skryptu bez żadnych modyfikacji, możesz wyeksportować swoją zmienną.
i użyj,
os.environ
aby go odzyskać.To znacznie zdrowsze / bezpieczniejsze podejście.
Pobieranie danych wyjściowych z Python
Możesz użyć podstawienia polecenia, aby zebrać dane wyjściowe skryptu.
(zwróć uwagę, że wszystkie końcowe znaki nowego wiersza są usuwane)
źródło
"You could also pass the variable to the script as an argument"
, jak byś to zrobił, biorąc pod uwagę, że skrypt Pythona jest osadzony w skrypcie powłoki?print '$SHELL'
składałby się tylko z tego , wynik byłby taki,/bin/bash
jakikolwiek jest twoja powłoka. Jeśli zmienisz pierwszy wiersz napython - <<'END'
, wynikiem będzie$SHELL
. Jeśli kopiujesz i wklejasz istniejący kod, aby osadzić go w skrypcie bash, prawie na pewno nie chcesz zastępowania powłoki - chcesz, aby kod działał w taki sam sposób, jak nie jest osadzony w skrypcie bash, prawda?Problem z twoim podejściem polega na tym, że osadzony skrypt Pythona nie ma już dostępu do oryginalnego standardowego wejścia (ponieważ jego standardowe wejście to ... samo).
Jeśli to jest problem, możesz napisać:
Lub jeśli skrypt Pythona może zawierać pojedyncze cudzysłowy:
Lub:
źródło
Użyj myślnika jako nazwy pliku:
Nie wiem, czy
sys.argv[1:]
jest to dobry sposób na zrobienie tego w Pythonie. Dla -e / -c możesz podać koniec argumentów za pomocą -:Przechwytywanie danych wyjściowych i przekierowywanie STDERR:
źródło
1) Możesz napisać przypisania zmiennych do pliku w Pythonie, a następnie pobrać je ze skryptu bash.
2) Ponieważ twoje słowo (EOF) nie jest cytowane, wszystkie wiersze dokumentu tutaj podlegają rozszerzeniu parametrów. Możesz użyć tego do przekazania rzeczy do skryptu python.
źródło