2011-09-22 187 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:])' –