Выполнить скрипт на языке Python с переменной
У меня есть такой код:
opts.info("Started domain %s (id=%d)" % (dom, domid))
Я хочу выполнить скрипт оболочки с параметром domid Сверху.
Что-то вроде этого:
subprocess.call(['test.sh %d', domid])
Как это работает?
Я пробовал это с:
subprocess.call(['test.sh', domid])
Но я получаю эту ошибку:
File "/usr/lib/xen-4.1/bin/xm", line 8, in <module>
main.main(sys.argv)
File "/usr/lib/xen-4.1/bin/../lib/python/xen/xm/main.py", line 3983, in main
_, rc = _run_cmd(cmd, cmd_name, args)
File "/usr/lib/xen-4.1/bin/../lib/python/xen/xm/main.py", line 4007, in _run_cmd
return True, cmd(args)
File "<string>", line 1, in <lambda>
File "/usr/lib/xen-4.1/bin/../lib/python/xen/xm/main.py", line 1519, in xm_importcommand
cmd.main([command] + args)
File "/usr/lib/xen-4.1/bin/../lib/python/xen/xm/create.py", line 1562, in main
dom = make_domain(opts, config)
File "/usr/lib/xen-4.1/bin/../lib/python/xen/xm/create.py", line 1458, in make_domain
subprocess.call(['test.sh', domid])
File "/usr/lib/python2.7/subprocess.py", line 493, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
TypeError: execv() arg 2 must contain only strings
4 ответов:
Вот так ?
subprocess.call(['test.sh', str(domid)])Документация доступна на веб-сайте python
Винс,
Я также хотел сделать то же самое, что и этот пост. Выполнить скрипт оболочки из python с переменной (с переменной я думаю, что это означает с аргументом командной строки).
Я сделал следующее, Чтобы получить результаты. Я делюсь на случай, если другие люди ищут тот же ответ.import os arglist = 'arg1 arg2 arg3' bashCommand = "/bin/bash script.sh " + arglist os.system(bashCommand)Что меня вполне устраивало.
Я также, после более подробного прочтения, предполагаю, что было бы лучше использовать подпроцесс.Попен, если вы хотите получить результаты обратно для цели показа. Я записываю все в другой файл с помощью скрипта bash, поэтому у меня нет необходимости в подпроцессе.
Надеюсь, это поможет.
import os os.system("cat /root/test.sh") #!/bin/bash x='1' while [[ $x -le 10 ]] ; do echo $x: hello $1 $2 $3 sleep 1 x=$(( $x + 1 )) done arglist = 'arg1 arg2 arg3' bashCommand = 'bash /root/test.sh ' + arglist os.system(bashCommand) 1: hello arg1 arg2 arg3 2: hello arg1 arg2 arg3 3: hello arg1 arg2 arg3 4: hello arg1 arg2 arg3 5: hello arg1 arg2 arg3
Простое решение, которое нужно запомнить:
import os bashCommand = "source script.sh" os.system(bashCommand)
Вам нужно вызвать скрипт оболочки следующим образом из вашего скрипта python:
subprocess.call(['test.sh', domid])Смотритездесь для документации модуля подпроцесса. В приведенном выше сценарии мы передаем список методу
call, где первый элемент-это программа, которая будет выполняться, а остальные элементы в списке-аргументы для программы.
Comments