Выполнить скрипт на языке 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
648   4  

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

    Ничего не найдено.