我想从Python中的代码发送一个变量到Ubuntu中的shell命令。任何人都可以帮助我如何做到这一点?目前,我有如何发送Python变量到shell命令?
import os
s=5
command = os.popen('stress -c 5 -i 1 -m 1 --vm-bytes 128M -t s')
我想将s
变量发送到这个命令,而不是直接说超时的时间。
我想从Python中的代码发送一个变量到Ubuntu中的shell命令。任何人都可以帮助我如何做到这一点?目前,我有如何发送Python变量到shell命令?
import os
s=5
command = os.popen('stress -c 5 -i 1 -m 1 --vm-bytes 128M -t s')
我想将s
变量发送到这个命令,而不是直接说超时的时间。
这是一个字符串替换操作,您可以获取所有信息here。
或者你也可以将串连在一起。 (good tutorial)
我假设的'在你的命令字符串是要假设你的变量“S”的价值是什么?所有你需要做的是这样的:
command = os.popen('stress -c 5 -i 1 -m 1 --vm-bytes 128M -t ' + str(s))
如果我看错了,你正在试图取代5,它基本上是相同的
command = os.popen('stress -c ' + str(s) + ' -i 1 -m 1 --vm-bytes 128M -t s')
虽然它会起作用,但这是一个坏习惯。包含在命令行中的值应该被正确地转义,或者命令应该在Python方面被分割为令牌。如果's'来自不可信来源,则可能是'; rm -rf /;' – viraptor
@viraptor我同意转义,但它看起来像变量是OP的脚本中的一个常量,因此可以安全地执行快速版本。作为一个技术性问题,'rm -rf /'不起作用(我测试了它),因为rm不会让你删除root,所以你需要'rm -rf/*'。即使这样,也有一些文件不会让你删除,但这会使操作系统几乎无法使用。 – Cody
我知道它不工作 - 这就是为什么我总是使用破碎版本的例子:) – viraptor
使用标准的子模块:
import subprocess
s = 5
cmd = ['stress', '-c', '5', '-i', '1', '-m', '1',
'--vm-bytes', '128M', '-t', str(s)]
subprocess.call(cmd)
使用子流程模块,可以使每个参数分别独立传递。你只需要将它们转换为字符串。
如果's'的值本身包含双引号,则第一种方法将不起作用。第二种方法确实是唯一可靠的方法。 – chepner
当然,我也同意第二种方法更可靠。但是,就我而言,第一种方法是有效的。 –
使用外部链接来支持您的答案,而不是整个答案本身。 – chepner
我相信答案是字符串替换,并且链接通过给出详细信息如何做到这一点来支持答案...... –
如果您尚不知道,则无法在不咨询外部资源的情况下使用*此答案串替换操作是什么。在存在报价问题时,这也不是一个好的答案。 – chepner