Appeler le script Python à partir de bash avec l'argument

91

Je sais que je peux exécuter un script python à partir de mon script bash en utilisant ce qui suit:

python python_script.py

Mais qu'en est-il si je voulais passer une variable / argument à mon script python à partir de mon script bash. Comment puis je faire ça?

Fondamentalement, bash établira un nom de fichier, puis python le téléchargera, mais je dois envoyer le nom de fichier de bash à python lorsque je l'appelle.

Jimmy
la source
lors de l'exécution python python_script.pydans votre shell par défaut dans Debian, vous utilisez déjà bash ... alors faites simplement dans votre script bash:python python_script.py arg1 arg2 ...
Oz123
@Jimmy Question non préparée, je pense, son lien très facile: tutorialspoint.com/python/python_command_line_arguments.htm
Grijesh Chauhan

Réponses:

133

Pour exécuter un script python dans un script bash, vous devez appeler la même commande que vous le feriez dans un terminal. Par exemple

> python python_script.py var1 var2

Pour accéder à ces variables dans python, vous aurez besoin

import sys
print sys.argv[0] # prints python_script.py
print sys.argv[1] # prints var1
print sys.argv[2] # prints var2
duckman_1991
la source
Merci. Cependant, cette façon limite le fichier python à un seul cas d'utilisation. Existe-t-il un moyen d'appeler des méthodes d'un fichier python avec des paramètres dynamiques dans des scripts bash? De cette façon, nous pourrons utiliser le même fichier python. J'ai essayé de faire cela avec des méthodes d'appels de fichiers python avec $ var dans le script bash. Mais cela a échoué d'une manière ou d'une autre.
burcak
@burcak Si vous souhaitez exécuter le fichier python en parallèle en fonction des paramètres dynamiques, commencez par construire le chemin complet << chemin de l'emplacement du script python >> / << nom du script python >> param1 param2 | << chemin de l'emplacement du script python >> / << nom du script python >> param3 param4 dans le script bash, puis passez la sortie en tant qu'argument au script python ci-dessous, import sys import sous-processus arg_str = "" .join (sys.argv [1:]) cmds = arg_str. split ('|') pour cmd dans cmds: print ('call -' + cmd) subprocess.Popen (cmd, shell = True) print ('call cmds completed')
Thiru
21

Utilisation

python python_script.py filename

et dans votre script Python

import sys
print sys.argv[1]
NPE
la source
21

À côté sys.argv, jetez également un œil au module argparse , qui permet de définir les options et les arguments des scripts.

Le module argparse facilite l'écriture d'interfaces de ligne de commande conviviales.

Miku
la source
Je suis d'accord, pour moi argparse est une bien meilleure option que sys.argv
Mo Ali
8

Option intégrée:

Enveloppez le code python dans une fonction 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

Utilisez des variables d'environnement pour transmettre des données à votre script python intégré.

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

utiliser dans le script:

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

ou

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

Le script sera exécuté sans sortie.

boursier
la source
possible de remplacer "string arg" par une variable provenant de bash?
CodeGuru
1

J'ai un script bash qui appelle une petite routine python pour afficher une fenêtre de message. Comme j'ai besoin d'utiliser killall pour arrêter le script python, je ne peux pas utiliser la méthode ci-dessus car cela signifierait alors exécuter killall python qui pourrait supprimer d'autres programmes python donc j'utilise

pythonprog.py "$argument"& # Le & renvoie le contrôle directement au script bash donc doit être en dehors des backticks. L'aperçu de ce message l'affiche sans "` "l'un ou l'autre côté de la commande pour une raison quelconque.

Tant que le script python s'exécutera à partir du cli par son nom plutôt que de python pythonprog.py, cela fonctionne dans le script. Si vous avez besoin de plus d'un argument, utilisez simplement un espace entre chacun d'eux entre les guillemets.

Dave Thebuskeruk
la source
-1

et jetez un œil au module getopt . Cela fonctionne assez bien pour moi!

HappyHacking
la source
la documentation getopt démarre: Remarque: Le module getopt est un analyseur d'options de ligne de commande dont l'API est conçue pour être familière aux utilisateurs de la fonction C getopt (). Les utilisateurs qui ne sont pas familiers avec la fonction C getopt () ou qui aimeraient écrire moins de code et obtenir une meilleure aide et des messages d'erreur devraient envisager d'utiliser le module argparse à la place.
cate le