2011-09-22 5 views
7

Finalement, je comprends cela et cela fonctionne.Comment passer une variable Bash à Python?

script bash:

#!/bin/bash 
#$ -V 
#$ -cwd 
#$ -o $HOME/sge_jobs_output/$JOB_ID.out -j y 
#$ -S /bin/bash 
#$ -l mem_free=4G 


c=$SGE_TASK_ID 
cd /home/xxx/scratch/test/ 
FILENAME=`head -$c testlist|tail -1` 
python testpython.py $FILENAME 

script python:

#!/bin/python 
import sys,os 


path='/home/xxx/scratch/test/' 
name1=sys.argv[1] 
job_id=os.path.join(path+name1) 
f=open(job_id,'r').readlines() 
print f[1] 

thx

+0

Quelle partie du module 'argparse' vous rend confus? http://docs.python.org/dev/library/argparse.html. Il est utile de poser des questions plus spécifiques sur le problème que vous rencontrez avec votre code. Veuillez poster du code, en utilisant 'argparse' et poser des questions spécifiques. –

+0

Passez-le en tant que paramètre de ligne de commande, puis retirez-le de sys.argv. – GreenMatt

Répondre

12

variables Bash ne sont pas des variables d'environnement. Vous obtenez à travers l'objet os.environ avec une interface de type dictionnaire. Notez qu'il existe deux types de variables dans Bash: celles qui sont locales au processus en cours et celles qui sont héritées par les processus enfants. Votre script Python est un processus enfant, vous devez donc vous assurer que vous avez la variable à laquelle le processus enfant doit accéder.

Pour répondre à votre question initiale, vous devez d'abord exporter la variable, puis y accéder à partir du script python à l'aide de os.environ. Alternativement, vous pouvez passer la variable comme argument de ligne de commande, ce que fait votre code maintenant. Dans ce cas, vous devez regarder dans sys.argv, qui est la liste des arguments passés à votre script. Ils apparaissent dans sys.argv dans le même ordre que vous les avez spécifié lors de l'appel du script. sys.argv[0] contient toujours le nom du programme en cours d'exécution. Les entrées suivantes contiennent d'autres arguments. len(sys.argv) indique le nombre d'arguments reçus par le script.

#!/bin/python 
import sys 
import os 

if len(sys.argv) < 2: 
    print 'Usage: ' + sys.argv[0] + ' <filename>' 
    sys.exit(1) 

print 'This is the name of the python script: ' + sys.argv[0] 
print 'This is the 1st argument:    ' + sys.argv[1] 

f=open('/home/xxx/scratch/test/' + sys.argv[1],'r').readlines() 
print f[1] 
0

arguments de ligne de commande du script sont disponibles liste sys.argv.

1

Jetez un oeil à parsing Python arguments. Votre code bash serait bien, il suffit de modifier votre script Python pour prendre l'argument.

+0

Désolé encore confus ... quelqu'un peut-il ajouter sys.argv dans le code python? – user815408

+0

Vous devrez ajouter 'import sys' et changer le script python pour accepter les arguments en utilisant quelque chose comme' args [1] ' – aus

0

utiliser ce dans le script (Edited par suggestion Aarons):

def main(args): 
    do_something(args[0]) 


if __name__ == "__main__": 
    import sys 
    main(sys.argv[1:]) 
+0

' bool (sys.argv) 'est toujours' true' et 'sys.argv [0 ] 'contiendra le nom du script. – wRAR

+1

haters va haïr, corrigé – MattoTodd

+1

Si vous allez passer les arguments à une fonction, il est plus commun de couper le nom du script afin que la fonction n'a pas besoin de savoir pour l'ignorer. c'est-à-dire 'main (sys.argv [1:])' –

Questions connexes