Сценарий оболочки, принимающий в качестве аргумента переменную Python

#python #shell #subprocess

Вопрос:

У меня есть простой скрипт на Python с именем ‘scriptNastran.py’ это вызывает оболочку через функцию подпроцесса:

 import subprocess

subprocess.call(['sh', './launchNastran.sh'])
 

Мой launchNastran.sh является :

 /appli/nastran -msc20121 TRAM mem=512M buffsize=25601 batch=no    
CHEMIN='/users/develop/tmp/input'
cp -rf TRAM MODELE ./*f06 ./*f04 ./*log ./*op2 ./*pch $CHEMIN
 

Файлы TRAM и MODELE находятся в том же каталоге, что и оболочка и скрипт Python. Этот каталог отображается в оболочке: CHEMIN='/users/develop/tmp/input

Однако каталог изменяется в скрипте Python, поэтому я хотел бы передать каталог arg_directory, определенный в скрипте Python, в качестве аргумента для оболочки, что-то вроде:

 import subprocess
arg_directory = 'hello world'
subprocess.call(['sh', './launchNastran.sh'])
 

Для скрипта python и вот так для оболочки:

 $ scriptNastran.py arg_directory

/appli/nastran -msc20121 TRAM mem=512M buffsize=25601 batch=no    
CHEMIN= arg_directory
cp -rf TRAM MODELE ./*f06 ./*f04 ./*log ./*op2 ./*pch $CHEMIN
 

Знает ли кто-нибудь, как это сделать?

Спасибо вам за вашу помощь 🙂

Комментарии:

1. Ваша цель — запустить launchNastran.sh внутри python ИЛИ получить результат от python, а затем перейти к launchNastran.sh сценарию оболочки ?

2. Моя цель состоит в том, чтобы запустить launchNastran.sh в пределах python

Ответ №1:

Вы можете передать каталог в качестве аргумента:

 import subprocess
arg_directory = 'hello world'
subprocess.call(['sh', './launchNastran.sh', arg_directory])
 

а затем прочтите это в своем сценарии оболочки

 /appli/nastran -msc20121 TRAM mem=512M buffsize=25601 batch=no    
CHEMIN="$1"
cp -rf TRAM MODELE ./*f06 ./*f04 ./*log ./*op2 ./*pch "$CHEMIN"
 

Комментарии:

1. Просто и элегантно! Огромное спасибо

Ответ №2:

launchNastran.py

 def call_shell(CHEMIN_path):
    import subprocess
    ssh_command_string='''
        /appli/nastran -msc20121 TRAM mem=512M buffsize=25601 batch=no    
        CHEMIN={path}
        cp -rf TRAM MODELE ./*f06 ./*f04 ./*log ./*op2 ./*pch $CHEMIN
    '''.format(path=CHEMIN_path). ## put the path you have in format 
    subprocess.Popen(ssh_command_string, shell=True)
call_shell('/users/develop/tmp/input') ## call the shell script