Как передать переменную Bash в Python? - PullRequest
8 голосов
/ 23 сентября 2011

В конце концов я понимаю это, и это работает.

скрипт 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

Ответы [ 4 ]

14 голосов
/ 23 сентября 2011

Экспортированные переменные bash на самом деле являются переменными окружения. Вы получаете их через объект os.environ со словарным интерфейсом. Обратите внимание, что в Bash есть два типа переменных: локальные для текущего процесса и наследуемые дочерними процессами. Ваш сценарий Python является дочерним процессом, поэтому вам необходимо убедиться, что вы export указали переменную, к которой должен иметь доступ дочерний процесс.

Чтобы ответить на исходный вопрос, вам нужно сначала экспортировать переменную, а затем получить к ней доступ из скрипта python, используя 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]

В качестве альтернативы, вы можете передать переменную в качестве аргумента командной строки, что и делает ваш код сейчас. В этом случае вы должны посмотреть в 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]
1 голос
/ 23 сентября 2011

Взгляните на парсинг аргументов Python . Ваш bash-код будет в порядке, просто нужно отредактировать скрипт Python, чтобы получить аргумент.

0 голосов
/ 23 сентября 2011

используйте это в вашем скрипте (отредактировано согласно предложению Aarons):

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


if __name__ == "__main__":
    import sys
    main(sys.argv[1:])
0 голосов
/ 23 сентября 2011

Аргументы командной строки для скрипта доступны в виде sys.argv списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...