11

我有这个代码:

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

我想使用domid上面的参数执行一个 shell 脚本。像这样的东西:

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

4 回答 4

16

像这样 ?

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

文档可在python 网站上找到

于 2013-09-11T13:35:52.973 回答
4

我也想做和这篇文章一样的事情。使用变量从 python 执行 Shell 脚本(使用变量我认为这意味着使用命令行参数)。

我做了以下得到结果。我正在分享以防其他人正在寻找相同的答案。

    导入操作系统
    arglist = 'arg1 arg2 arg3'
    bashCommand = "/bin/bash script.sh " + arglist
    os.system(bashCommand)

这对我来说很好。

我也,在阅读更多内容后,建议最好使用 subprocess.Popen,如果您想获取结果以用于显示目的。我正在使用 bash 脚本将所有内容记录到另一个文件中,所以我真的不需要子进程。

我希望它有所帮助。

    导入操作系统
    os.system("cat /root/test.sh")
    #!/bin/bash
    x='1'
    而 [[ $x -le 10 ]] ; 做
      回声 $x: 你好 $1 $2 $3
      睡觉 1
      x=$(($x + 1))
    完毕

    arglist = 'arg1 arg2 arg3'
    bashCommand = 'bash /root/test.sh' + arglist
    os.system(bashCommand)
    1:你好 arg1 arg2 arg3
    2:你好 arg1 arg2 arg3
    3:你好 arg1 arg2 arg3
    4:你好 arg1 arg2 arg3
    5:你好 arg1 arg2 arg3
于 2014-01-08T01:20:33.663 回答
1

要记住的简单解决方案:

import os
bashCommand = "source script.sh"
os.system(bashCommand)
于 2013-09-11T13:42:56.380 回答
0

您需要从您的 python 脚本中以以下方式调用 shell 脚本:

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

有关子流程模块的文档,请参阅此处。在上面的脚本中,我们将一个列表传递给call方法,其中第一个元素是要执行的程序,列表中的其余元素是程序的参数。

于 2013-09-11T13:37:57.023 回答