Wywołaj skrypt Pythona z basha z argumentem

91

Wiem, że mogę uruchomić skrypt w języku Python z mojego skryptu bash, używając następującego:

python python_script.py

Ale co jeśli chciałbym przekazać zmienną / argument do mojego skryptu Pythona z mojego skryptu bash. Jak mogę to zrobić?

Zasadniczo bash opracuje nazwę pliku, a następnie Python go załaduje, ale muszę wysłać nazwę pliku z bash do pythona, kiedy go wywołam.

Jimmy
źródło
kiedy uruchamiasz python python_script.pyw swojej domyślnej powłoce w Debianie, używasz już basha ... więc po prostu zrób to w swoim skrypcie bash:python python_script.py arg1 arg2 ...
Oz123
@Jimmy Unprepared Pytanie Myślę, że to bardzo łatwe Link: tutorialspoint.com/python/python_command_line_arguments.htm
Grijesh Chauhan

Odpowiedzi:

133

Aby wykonać skrypt Pythona w skrypcie bash, musisz wywołać to samo polecenie, które zrobiłbyś w terminalu. Na przykład

> python python_script.py var1 var2

Aby uzyskać dostęp do tych zmiennych w Pythonie, będziesz potrzebować

import sys
print sys.argv[0] # prints python_script.py
print sys.argv[1] # prints var1
print sys.argv[2] # prints var2
duckman_1991
źródło
Dzięki. Jednak w ten sposób ogranicza plik Pythona tylko do jednego przypadku użycia. Czy istnieje sposób na wywołanie metod pliku Pythona z parametrami dynamicznymi w skryptach bash? W ten sposób będziemy mogli użyć tego samego pliku Pythona. Próbowałem to zrobić za pomocą wywołań metod plików pythona z $ var w skrypcie bash. Ale jakoś się nie udało.
burcak
@burcak Jeśli chcesz uruchomić plik Pythona równolegle na podstawie parametrów dynamicznych, najpierw utwórz pełną ścieżkę << ścieżka do lokalizacji skryptu w języku Python >> / << nazwa skryptu w języku Python >> param1 param2 | << ścieżka do lokalizacji skryptu w języku python >> / << nazwa skryptu pythona >> param3 param4 w skrypcie bash, a następnie przekaż dane wyjściowe jako argument do poniższego skryptu w języku Python, import sys import subprocess arg_str = "" .join (sys.argv [1:]) cmds = arg_str. split ('|') dla cmd w cmds: print ('call -' + cmd) podproces.Popen (cmd, shell = True) print ('call cmds finish')
Czw
21

Posługiwać się

python python_script.py filename

oraz w swoim skrypcie Pythona

import sys
print sys.argv[1]
NPE
źródło
21

Oprócz sys.argvtego spójrz również na moduł argparse , który pomaga definiować opcje i argumenty dla skryptów.

Moduł argparse ułatwia pisanie przyjaznych dla użytkownika interfejsów wiersza poleceń.

miku
źródło
Zgadzam się, dla mnie argparse jest znacznie lepszą opcją niż sys.argv
Mo Ali
8

Wbudowana opcja:

Zawiń kod Pythona w funkcję bash.

#!/bin/bash

function current_datetime {
python - <<END
import datetime
print datetime.datetime.now()
END
}

# Call it
current_datetime

# Call it and capture the output
DT=$(current_datetime)
echo Current date and time: $DT

Użyj zmiennych środowiskowych, aby przekazać dane do osadzonego skryptu w języku Python.

#!/bin/bash

function line {
PYTHON_ARG="$1" python - <<END
import os
line_len = int(os.environ['PYTHON_ARG'])
print '-' * line_len
END
}

# Do it one way
line 80

# Do it another way
echo $(line 80)

http://bhfsteve.blogspot.se/2014/07/embedding-python-in-bash-scripts.html

user77115
źródło
1

użyj w skrypcie:

echo $(python python_script.py arg1 arg2) > /dev/null

lub

python python_script.py "string arg"  > /dev/null

Skrypt zostanie wykonany bez wyjścia.

burseaner
źródło
czy można zamienić „string arg” na zmienną pochodzącą z bash?
CodeGuru,
1

Mam skrypt bash, który wywołuje małą procedurę w języku Python, aby wyświetlić okno komunikatu. Ponieważ muszę użyć killall, aby zatrzymać skrypt Pythona, nie mogę użyć powyższej metody, ponieważ oznaczałoby to uruchomienie killall python, który mógłby usunąć inne programy w Pythonie, więc używam

pythonprog.py "$argument"& # & # Zwraca kontrolę bezpośrednio do skryptu bash, więc musi znajdować się poza znakami odwrotnymi. Podgląd tego komunikatu z jakiegoś powodu pokazuje go bez "" "po obu stronach polecenia.

Tak długo, jak skrypt pythona będzie uruchamiany z cli według nazwy, a nie python pythonprog.py, działa to w skrypcie. Jeśli potrzebujesz więcej niż jednego argumentu, po prostu użyj spacji między nimi w cudzysłowie.

Dave Thebuskeruk
źródło
-1

i spójrz na moduł getopt . U mnie działa całkiem nieźle!

HappyHacking
źródło
the getopt docs start: Uwaga: Moduł getopt jest parserem opcji wiersza poleceń, którego API zostało zaprojektowane tak, aby było znane użytkownikom funkcji getopt () języka C. Użytkownicy, którzy nie są zaznajomieni z funkcją getopt () w języku C lub którzy chcieliby napisać mniej kodu i uzyskać lepszą pomoc oraz komunikaty o błędach, powinni zamiast tego rozważyć użycie modułu argparse.
cate