2011-09-22 186 views
7

最終我明白這一點,它的工作原理。如何將Bash變量傳遞給Python?

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 

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

'argparse'模塊的哪個部分會讓您感到困惑? http://docs.python.org/dev/library/argparse.html。它有助於針對您在代碼中遇到的問題提出更多**具體的**問題。請張貼代碼,使用'argparse'並提出具體問題。 –

+0

將它作爲命令行參數傳遞,然後將其從sys.argv中取出。 – GreenMatt

回答

12

猛砸變量實際上是環境變量。您可以通過os.environ對象使用類似字典的界面來獲取它們。請注意,Bash中有兩種類型的變量:當前進程的局部變量以及子進程繼承的變量。你的Python腳本是一個子進程,所以你需要確保你想讓子進程訪問的變量。

要回答您的原始問題,您需要先導出變量,然後使用os.environ從python腳本中訪問它。

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

或者,您可以將該變量作爲命令行參數傳遞,這就是您的代碼現在正在執行的操作。在這種情況下,您必須查看sys.argv,這是傳遞給腳本的參數列表。它們按照您在調用腳本時指定的順序出現在sys.argv中。 sys.argv[0]總是包含正在運行的程序的名稱。後續條目包含其他參數。 len(sys.argv)表示腳本收到的參數數量。

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

的命令行參數的腳本可作爲sys.argv列表。

1

看看parsing Python arguments。你的bash代碼會很好,只需要編輯你的Python腳本來接受這個參數。

+0

對不起仍然困惑...任何人都可以添加sys.argv到Python代碼? – user815408

+0

您需要添加'import sys'並將python腳本更改爲接受參數,如'args [1]' – aus

0

使用這個腳本內(每阿倫斯建議修改):

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


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

'bool(sys.argv)'總是'True'和'sys.argv [0] ]'將包含腳本名稱。 – wRAR

+1

仇恨者會討厭,糾正 – MattoTodd

+1

如果你打算將參數傳遞給一個函數,那麼更常見的是切斷腳本名稱,這樣函數不需要知道忽略它。即'main(sys.argv [1:])' –