【问题标题】:Execute Shell Script from python with arguments使用参数从 python 执行 Shell 脚本
【发布时间】:2013-10-21 23:13:10
【问题描述】:

我想从 python 脚本中执行一个带有 3 个参数的 shell 脚本。 (如此处所述:Python: executing shell script with arguments(variable), but argument is not read in shell script

这是我的代码:

subprocess.call('/root/bin/xen-limit %s %s %s' % (str(dom),str(result),str('--nosave'),), shell=True)

变量 dom 和 result 包含字符串。

这是输出:

/bin/sh: --nosave: not found

更新:

即变量“结果”:

c1 = ['/bin/cat', '/etc/xen/%s.cfg' % (str(dom))]
p1 = subprocess.Popen(c1, stdout=subprocess.PIPE)

c2 = ['grep', 'limited']
p2 = subprocess.Popen(c2, stdin=p1.stdout, stdout=subprocess.PIPE)

c3 = ['cut', '-d=', '-f2']
p3 = subprocess.Popen(c3, stdin=p2.stdout, stdout=subprocess.PIPE)

c4 = ['tr', '-d', '\"']
p4 = subprocess.Popen(c4, stdin=p3.stdout, stdout=subprocess.PIPE)

result = p4.stdout.read()

之后,变量 result 包含一个带有 mbit 的数字(例如 16mbit)

而dom是一个类似“myserver”的字符串

【问题讨论】:

  • subprocess.call('/root/bin/xen-limit %s %s %s' % (str(dom),str(result),'--nosave'), shell=True) 怎么样?
  • @yakiang 得到同样的错误:/
  • result 的值是多少?听起来它包含一些终止命令的 shell 元字符,使 --nosave 看起来像第二个命令,而不是 xen-limit 的选项。
  • @chepner 它包含一个带 mbit 的数字(例如 16mbit)我已经更新了我的第一篇文章。
  • 如果你把--nosave放在前面,你会得到同样的错误吗?您在下面的评论中“回显 3 个参数”是什么意思?

标签: python linux bash arguments execute


【解决方案1】:
from subprocess import Popen, STDOUT, PIPE
print('Executing: /root/bin/xen-limit ' + str(dom) + ' ' + str(result) + ' --nosave')
handle = Popen('/root/bin/xen-limit ' + str(dom) + ' ' + str(result) + ' --nosave', shell=True, stdout=PIPE, stderr=STDOUT, stdin=PIPE)
print(handle.stdout.read())

如果这不起作用,我真的不知道会发生什么。 这是描述打开 3:d 方应用程序或脚本同时仍为您提供所需调试的最基本但错误的方式。

【讨论】:

  • 这里是输出:Executing: /root/bin/xen-limit test1 016mbit --nosave--nosave 换行了。我得到同样的错误(--nosave not found)
  • @Vince 试试下面的print([str(dom), str(result)]),告诉我你只是在字符串中有一个\n,而你忘记解析了。
  • 它是如何到达那里的? :P 好的,我已经用 tr 删除了它,现在它可以工作了。非常感谢! (Y)
  • 呵呵,谁知道呢.. IT Ghosts 可能 ;) 不客气,通常最简单的解决方案是打印 [..] 列表中的任何数据,您会看到任何不一致的地方可能会影响您的结果,tl;dr:它可以帮助您分析您的数据 :) 很高兴它修复了它,并且 GL 通过您的努力 ;)
【解决方案2】:

为什么不将--nosave保存到一个变量中,然后将变量传递给subprocess

【讨论】:

  • 我相信这不是 Python 调用的问题。您是否通过第三个参数分别检查了您的 shell 脚本?你成功了吗?
  • 如果我手动运行脚本(xen-limit myserver 16mbit --nosave)并回显 3 个参数,它可以工作。但是当我启动python脚本时,3.参数为空
【解决方案3】:

传递由命令名称及其参数组成的列表更简单(也更安全)。

subprocess.call(['/root/bin/xen-limit]',
                str(dom),
                str(result),
                str('--nosave')
                ])

str('--nosave') 是一个空操作,因为'--nosave' 已经是一个字符串。 domresult 可能也是如此。

【讨论】: