Выполнить оболочку Script из python с переменной

У меня есть этот код:

opts.info("Started domain %s (id=%d)" % (dom, domid))

Я хочу выполнить оболочку script с параметром 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

Ответ 1

Как это?

subprocess.call(['test.sh', str(domid)])

Документация доступна на сайте python

Ответ 2

Простое решение для запоминания:

import os
bashCommand = "source script.sh"
os.system(bashCommand)

Ответ 3

Винс,

Я тоже хотел сделать то же самое, что и этот пост. Выполнить Shell Script из python с переменной (с переменной, я думаю, это означает с аргументом командной строки).

Я сделал следующее, чтобы получить результаты. Я делюсь тем, что другие люди ищут тот же ответ.

    import os
    arglist = 'arg1 arg2 arg3'
    bashCommand = "/bin/bash script.sh " + arglist 
    os.system(bashCommand)

который работал отлично для меня.

Я также, после большего чтения, предлагает, чтобы было бы лучше использовать subprocess.Popen, если вы хотите вернуть результаты для отображения. Я записываю все в другой файл с помощью bash script, поэтому мне не нужен субпроцесс.

Надеюсь, это поможет.

    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

Ответ 4

Вам нужно вызвать оболочку script следующим образом из вашего python script:

subprocess.call(['test.sh', domid])

Обратитесь здесь для документации модуля подпроцесса. В приведенном выше script мы передаем список методу call, где первым элементом является исполняемая программа, а остальные элементы в списке являются аргументами программы.