2011-09-22 38 views
7

Eventualmente lo entiendo y funciona.¿Cómo pasar una variable Bash a Python?

escritura del golpe:

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

¿Qué parte del módulo 'argparse' te confunde? http://docs.python.org/dev/library/argparse.html. Ayuda hacer más preguntas ** específicas ** sobre el problema que estás teniendo con tu código. Por favor, publique el código, usando 'argparse' y haga preguntas específicas. –

+0

Pásalo como un parámetro de línea de comando y luego sácalo de sys.argv. – GreenMatt

Respuesta

12

las variables del golpe son en realidad variables de entorno. Puede acceder a ellos a través del objeto os.environ con una interfaz tipo diccionario. Tenga en cuenta que hay dos tipos de variables en Bash: las locales del proceso actual y las heredadas por procesos secundarios. Su secuencia de comandos de Python es un proceso secundario, por lo que debe asegurarse de que export la variable a la que desea que acceda el proceso secundario.

Para responder a su pregunta original, primero debe exportar la variable y luego acceder desde dentro del script de python usando 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] 

Alternativamente, es posible pasar la variable como un argumento de línea de comandos, que es lo que el código está haciendo ahora. En ese caso, debe buscar en sys.argv, que es la lista de argumentos pasados ​​a su secuencia de comandos. Aparecen en sys.argv en el mismo orden que los especificó al invocar el script. sys.argv[0] siempre contiene el nombre del programa que se está ejecutando. Las entradas subsiguientes contienen otros argumentos. len(sys.argv) indica la cantidad de argumentos que recibió la secuencia de comandos.

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

argumentos de línea de comandos a la secuencia de comandos están disponibles como sys.argv lista.

1

Eche un vistazo a parsing Python arguments. Su código bash estaría bien, solo necesita editar su script Python para tomar el argumento.

+0

lo siento todavía confundido ... ¿alguien puede agregar sys.argv en el código python? – user815408

+0

Tendrá que agregar 'import sys' y cambiar la secuencia de comandos de python para aceptar los argumentos usando algo como' args [1] ' – aus

0

uso de este dentro del guión (editado por Aarons sugerencia):

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


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

' bool (sys.argv) 'siempre es' True' y 'sys.argv [0 ] 'contendrá el nombre del script. – wRAR

+1

los haters lo odiarán, corrigió – MattoTodd

+1

Si va a pasar los argumentos a una función, es más común cortar el nombre del script para que la función no necesite saber ignorarlo. es decir 'main (sys.argv [1:])' –

Cuestiones relacionadas