2011-09-22 38 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には、現在のプロセスにローカルな変数と、子プロセスによって継承される変数の2種類があります。 Pythonスクリプトは子プロセスなので、子プロセスがアクセスする変数はexportであることを確認する必要があります。

元の質問に答えるには、変数をエクスポートしてから、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'を追加し、' args [1] 'のようなものを使って引数を受け入れるようにpythonスクリプトを変更する必要があります。 – 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

haters gonna honna、訂正されない – MattoTodd

+1

引数を関数に渡す場合は、スクリプト名を切り捨てるのが一般的です。そのため、関数はそれを無視する必要はありません。すなわち、 'main(sys.argv [1:])' –

関連する問題