Chiama lo script Python da bash con argomento


91

So di poter eseguire uno script python dal mio script bash utilizzando quanto segue:

python python_script.py

Ma cosa succede se volessi passare una variabile / argomento al mio script python dal mio script bash. Come posso fare ciò?

Fondamentalmente bash elaborerà un nome file e poi Python lo caricherà, ma devo inviare il nome file da bash a python quando lo chiamo.


quando esegui python python_script.pynella tua shell predefinita in Debian stai già usando bash ... quindi fallo nel tuo script bash:python python_script.py arg1 arg2 ...
Oz123

@ Jimmy Unprepared Question Penso che sia molto semplice Link: tutorialspoint.com/python/python_command_line_arguments.htm
Grijesh Chauhan

Risposte:


132

Per eseguire uno script python in uno script bash devi chiamare lo stesso comando che faresti all'interno di un terminale. Per esempio

> python python_script.py var1 var2

Per accedere a queste variabili all'interno di python avrai bisogno di

import sys
print sys.argv[0] # prints python_script.py
print sys.argv[1] # prints var1
print sys.argv[2] # prints var2

Grazie. Tuttavia in questo modo si limita il file python per un solo caso d'uso. C'è un modo per chiamare i metodi di un file python con parametri dinamici all'interno degli script bash? In questo modo potremo utilizzare lo stesso file python. Ho provato a farlo con le chiamate ai metodi di file python con $ var all'interno dello script bash. Ma in qualche modo ha fallito.
burcak

@burcak Se si desidera eseguire il file python parallelamente in base ai parametri dinamici, creare innanzitutto il percorso completo << percorso della posizione dello script python >> / << nome dello script python >> param1 param2 | << percorso della posizione dello script python >> / << nome script python >> param3 param4 nello script bash, quindi passare l'output come argomento allo script python seguente, import sys import subprocess arg_str = "" .join (sys.argv [1:]) cmds = arg_str. split ('|') per cmd in cmds: print ('call -' + cmd) subprocess.Popen (cmd, shell = True) print ('call cmds finito')
Thiru

21

Uso

python python_script.py filename

e nel tuo script Python

import sys
print sys.argv[1]

21

Accanto sys.argv, anche dare un'occhiata al argparse modulo, che consente di definire le opzioni e gli argomenti per gli script.

Il modulo argparse semplifica la scrittura di interfacce a riga di comando intuitive.


Sono d'accordo, per me argparse è un'opzione molto migliore di sys.argv
Mo Ali

8

Opzione incorporata:

Avvolgi il codice Python in una funzione 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

Usa le variabili di ambiente per passare i dati al tuo script Python incorporato.

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


1

utilizzare nello script:

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

o

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

Lo script verrà eseguito senza output.


possibile sostituire "string arg" con una variabile che proviene da bash?
CodeGuru

1

Ho uno script bash che chiama una piccola routine Python per visualizzare una finestra di messaggio. Dato che ho bisogno di usare killall per fermare lo script python, non posso usare il metodo sopra in quanto significherebbe eseguire killall python che potrebbe eliminare altri programmi python, quindi lo uso

pythonprog.py "$argument"& # Il & restituisce il controllo direttamente allo script bash, quindi deve essere fuori dai backtick. L'anteprima di questo messaggio lo mostra senza "" "entrambi i lati del comando per qualche motivo.

Fintanto che lo script python verrà eseguito dal cli per nome anziché da python pythonprog.py, questo funziona all'interno dello script. Se hai bisogno di più di un argomento usa semplicemente uno spazio tra ognuno di essi tra virgolette.


-1

e dai un'occhiata al modulo getopt . Funziona abbastanza bene per me!


la documentazione getopt inizia: Nota: il modulo getopt è un parser per le opzioni della riga di comando la cui API è progettata per essere familiare agli utenti della funzione C getopt (). Gli utenti che non hanno familiarità con la funzione C getopt () o che vorrebbero scrivere meno codice e ottenere un aiuto migliore e messaggi di errore dovrebbero prendere in considerazione l'utilizzo del modulo argparse.
cate
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.