Wywołaj skrypt Pythona z Basha z argumentem

Wiem, że mogę uruchomić skrypt Pythona z mojego skryptu bash, używając następującego kodu:

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 ją prześle, ale muszę wysłać nazwę pliku z Basha do Pythona, gdy ją wywołam.

Author: Jimmy, 2013-01-04

8 answers

Aby wykonać skrypt Pythona w skrypcie bash, musisz wywołać tę samą komendę, co w terminalu. Na przykład

> python python_script.py var1 var2

Aby uzyskać dostęp do tych zmiennych w Pythonie, potrzebujesz

import sys
print sys.argv[0] # prints python_script.py
print sys.argv[1] # prints var1
print sys.argv[2] # prints var2
 145
Author: iamthedrake,
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-09-23 22:07:07

Użyj

python python_script.py filename

I w skrypcie Pythona

import sys
print sys.argv[1]
 22
Author: NPE,
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-04 10:50:37

Obok sys.argv, spójrz również na moduł argparse , który pomaga zdefiniować opcje i argumenty dla skryptów.

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

 22
Author: miku,
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-04 11:04:45

Opcja Wbudowana:

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 Pythona.

#!/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

 11
Author: user77115,
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-03-21 16:56:05

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.

 1
Author: burseaner,
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-07-27 15:51:43

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

pythonprog.py "$argument" & # kontrolka & zwraca bezpośrednio do skryptu bash, więc musi znajdować się poza backticami. Podgląd tego komunikatu pokazuje go bez " ` " po obu stronach polecenia dla niektórych powód.

Tak długo, jak skrypt Pythona będzie uruchamiany z cli po nazwie, a nie Pythona pythonprog.py to działa w skrypcie. Jeśli potrzebujesz więcej niż jednego argumentu, użyj spacji między każdym z nich w cudzysłowach.

 1
Author: Dave Thebuskeruk,
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-02-16 19:28:31

Wypisuje wszystkie args bez nazwy pliku:

for i in range(1, len(sys.argv)):
print(sys.argv[i])
 0
Author: Riade,
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
2020-11-18 10:49:16

I spójrz na moduł getopt . To działa całkiem dobrze dla mnie!

 -1
Author: HappyHacking,
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-04 11:07:00