Rufen Sie das Python-Skript von bash mit Argument auf

87

Ich weiß, dass ich mit meinem Bash-Skript ein Python-Skript ausführen kann, indem ich Folgendes verwende:

python python_script.py

Aber was ist, wenn ich eine Variable / ein Argument aus meinem Bash-Skript an mein Python-Skript übergeben wollte? Wie kann ich das machen?

Grundsätzlich berechnet bash einen Dateinamen und dann lädt Python ihn hoch, aber ich muss den Dateinamen von bash an python senden, wenn ich ihn aufrufe.

Jimmy
quelle
Wenn Sie python python_script.pyin Ihrer Standard-Shell in Debian ausführen, verwenden Sie Bash bereits ... also tun Sie es einfach in Ihrem Bash-Skript:python python_script.py arg1 arg2 ...
Oz123
@ Jimmy Unvorbereitete Frage Ich denke, es ist sehr einfach Link: tutorialspoint.com/python/python_command_line_arguments.htm
Grijesh Chauhan

Antworten:

127

Um ein Python-Skript in einem Bash-Skript auszuführen, müssen Sie denselben Befehl wie in einem Terminal aufrufen. Zum Beispiel

> python python_script.py var1 var2

Um auf diese Variablen in Python zugreifen zu können, benötigen Sie

import sys
print sys.argv[0] # prints python_script.py
print sys.argv[1] # prints var1
print sys.argv[2] # prints var2
duckman_1991
quelle
Vielen Dank. Auf diese Weise wird die Python-Datei jedoch nur für einen Anwendungsfall eingeschränkt. Gibt es eine Möglichkeit, Methoden einer Python-Datei mit dynamischen Parametern in Bash-Skripten aufzurufen? Auf diese Weise können wir dieselbe Python-Datei verwenden. Ich habe versucht, dies mit Aufrufen von Python-Dateimethoden mit $ var im Bash-Skript zu tun. Aber es ist irgendwie gescheitert.
Burcak
@burcak Wenn Sie die Python-Datei basierend auf den dynamischen Parametern parallel ausführen möchten, erstellen Sie zunächst den vollständigen Pfad << Pfad des Python-Skripts >> / << Name des Python-Skripts >> param1 param2 | << Pfad des Python-Skripts >> / << Python-Skriptname >> param3 param4 im Bash-Skript, dann übergeben Sie die Ausgabe als Argument an das folgende Python-Skript, importieren Sie den sys-Import-Unterprozess arg_str = "" .join (sys.argv [1:]) cmds = arg_str. split ('|') für cmd in cmds: print ('call -' + cmd) subprocess.Popen (cmd, shell = True) print ('call cmds beendet')
Thiru
21

Verwenden

python python_script.py filename

und in Ihrem Python-Skript

import sys
print sys.argv[1]
NPE
quelle
21

Neben sys.argvnehmen auch einen Blick auf das argparse - Modul, das für Skripte definieren Optionen und Argumente hilft.

Das argparse-Modul erleichtert das Schreiben benutzerfreundlicher Befehlszeilenschnittstellen.

miku
quelle
Ich stimme zu, für mich ist Argparse eine viel bessere Option als sys.argv
Mo Ali
7

Eingebettete Option:

Wickeln Sie Python-Code in eine Bash-Funktion.

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

Verwenden Sie Umgebungsvariablen, um Daten an Ihr eingebettetes Python-Skript zu übergeben.

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

Ich habe ein Bash-Skript, das eine kleine Python-Routine aufruft, um ein Nachrichtenfenster anzuzeigen. Da ich killall verwenden muss, um das Python-Skript zu stoppen, kann ich die obige Methode nicht verwenden, da dies dann bedeuten würde, killall python auszuführen, wodurch andere Python-Programme entfernt werden könnten, die ich verwende

pythonprog.py "$argument"& # Das & gibt die Steuerung direkt an das Bash-Skript zurück und muss sich daher außerhalb der Backticks befinden. In der Vorschau dieser Nachricht wird sie aus irgendeinem Grund ohne "` "auf beiden Seiten des Befehls angezeigt.

Solange das Python-Skript von der CLI aus nach Namen und nicht nach Python pythonprog.py ausgeführt wird, funktioniert dies innerhalb des Skripts. Wenn Sie mehr als ein Argument benötigen, verwenden Sie einfach ein Leerzeichen zwischen den einzelnen Argumenten in Anführungszeichen.

Dave Thebuskeruk
quelle
0

Verwendung im Skript:

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

oder

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

Das Skript wird ohne Ausgabe ausgeführt.

Burseaner
quelle
möglich, "string arg" durch eine Variable zu ersetzen, die von bash stammt?
CodeGuru
-1

und schauen Sie sich das getopt- Modul an. Es funktioniert ganz gut für mich!

HappyHacking
quelle
Die getopt-Dokumente werden gestartet: Hinweis: Das getopt-Modul ist ein Parser für Befehlszeilenoptionen, dessen API den Benutzern der Funktion C getopt () bekannt ist. Benutzer, die mit der Funktion C getopt () nicht vertraut sind oder weniger Code schreiben und bessere Hilfe und Fehlermeldungen erhalten möchten, sollten stattdessen das argparse-Modul verwenden.
Kate