2011-09-22 17 views
7

W końcu rozumiem to i działa.Jak przekazać zmienną Bash do Pythona?

bash skrypt:

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

skrypt Pythona:

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

Która część modułu 'argparse' wprawia Cię w zakłopotanie? http://docs.python.org/dev/library/argparse.html. Pomaga zadać więcej ** konkretnych ** pytań na temat problemu z kodem. Proszę napisać kod, używając 'argparse' i zadać konkretne pytania. –

+0

Przekaż go jako parametr wiersza polecenia, a następnie wyciągnij go z pliku sys.argv. – GreenMatt

Odpowiedz

12

zmienne Bash są rzeczywiście zmienne środowiskowe. Dostajesz się do nich przez obiekt os.environ z interfejsem podobnym do słownika. Zauważ, że w Bash istnieją dwa typy zmiennych: lokalne dla bieżącego procesu oraz te, które są dziedziczone przez procesy potomne. Twój skrypt w języku Python jest procesem podrzędnym, więc musisz upewnić się, że jesteś export zmienną, do której proces potomny ma mieć dostęp.

Aby odpowiedzieć na pierwotne pytanie, należy najpierw wyeksportować zmienną, a następnie uzyskać do niej dostęp ze skryptu Pythona za pomocą 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] 

Alternatywnie możesz przekazać zmienną jako argument wiersza poleceń, co właśnie robi Twój kod. W takim przypadku musisz sprawdzić w sys.argv, która jest listą argumentów przekazanych do twojego skryptu. Pojawiają się one w sys.argv w tej samej kolejności, w jakiej zostały określone podczas wywoływania skryptu. sys.argv[0] zawsze zawiera nazwę uruchomionego programu. Kolejne wpisy zawierają inne argumenty. len(sys.argv) wskazuje liczbę argumentów, które skrypt otrzymał.

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

wiersza poleceń argumenty skryptu są dostępne jako sys.argv listy.

1

Spójrz na parsing Python arguments. Twój kod basha byłby w porządku, wystarczy edytować skrypt w Pythonie, aby wziąć argument.

+0

Przepraszam, nadal zdezorientowany ... Czy ktoś może dodać sys.argv do kodu Pythona? – user815408

+0

Musisz dodać 'import sys' i zmienić skrypt Pythona tak, aby akceptował argumenty używając' args [1] ' – aus

0

użycie tego wewnątrz skryptu (wydanej za Aarons sugestia):

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


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

' bool (sys.argv) 'jest zawsze' True' i 'sys.argv [0 ] 'będzie zawierało nazwę skryptu. – wRAR

+1

Nienawidzą nienawidzić, poprawione – MattoTodd

+1

Jeśli masz zamiar przekazać argumenty do funkcji, jest bardziej powszechne odcięcie nazwy skryptu, więc funkcja nie musi wiedzieć, aby ją zignorować. tj. "main (sys.argv [1:])" –

Powiązane problemy