2011-09-22 28 views
7

Alla fine capisco questo e funziona.Come passare una variabile Bash a 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

Quale parte del modulo 'argparse' ti confonde? http://docs.python.org/dev/library/argparse.html. Ti aiuta a chiedere più ** domande ** specifiche sul problema che stai riscontrando con il tuo codice. Per favore pubblica il codice, usando 'argparse' e ​​fai domande specifiche. –

+0

Passalo come parametro della riga di comando e poi estrailo da sys.argv. – GreenMatt

risposta

12

variabili Bash sono in realtà le variabili d'ambiente. Si ottiene attraverso l'oggetto os.environ con un'interfaccia simile a un dizionario. Nota che esistono due tipi di variabili in Bash: quelli locali per il processo corrente e quelli che sono ereditati dai processi figli. Lo script Python è un processo secondario, quindi è necessario accertarsi di avere export la variabile a cui si desidera che il processo figlio acceda.

Per rispondere alla domanda originale, è necessario prima esportare la variabile e quindi accedervi dallo script python utilizzando os.environ.

##!/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/ 
export FILENAME=`head -$c testlist|tail -1` 
chmod +X testpython.py 
./testpython.py 


#!/bin/python 
import sys 
import os 

for arg in sys.argv: 
    print arg 

f=open('/home/xxx/scratch/test/' + os.environ['FILENAME'],'r').readlines() 
print f[1] 

In alternativa, è possibile passare la variabile come argomento della riga di comando, che è ciò che il codice sta facendo ora. In tal caso, devi cercare in sys.argv, che è l'elenco degli argomenti passati al tuo script. Vengono visualizzati nello sys.argv nello stesso ordine in cui sono stati specificati durante il richiamo dello script. sys.argv[0] contiene sempre il nome del programma in esecuzione. Le voci successive contengono altri argomenti. len(sys.argv) indica il numero di argomenti ricevuti dallo 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

argomenti della riga di comando per lo script sono disponibili come sys.argv lista.

1

Dai uno sguardo allo parsing Python arguments. Il tuo codice bash andrebbe bene, basta modificare il tuo script Python per prendere l'argomento.

+0

sorry ancora confuso ... qualcuno può aggiungere sys.argv nel codice python? – user815408

+0

Dovrai aggiungere 'import sys' e cambiare lo script python per accettare gli argomenti usando qualcosa come' args [1] ' – aus

0

uso questo all'interno dello script (A CURA per Aarons suggerimento):

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


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

' bool (sys.argv) 'è sempre' True' e 'sys.argv [0 ] 'conterrà il nome dello script. – wRAR

+1

gli odiatori che odieranno, corretti – MattoTodd

+1

Se hai intenzione di passare gli argomenti a una funzione, è più comune tagliare il nome dello script in modo che la funzione non debba sapere per ignorarlo. per esempio 'main (sys.argv [1:])' –

Problemi correlati