2016-08-17 116 views
0

我想从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变量发送到这个命令,而不是直接说超时的时间。

回答

-2

这是一个字符串替换操作,您可以获取所有信息here

或者你也可以将串连在一起。 (good tutorial

+0

使用外部链接来支持您的答案,而不是整个答案本身。 – chepner

+0

我相信答案是字符串替换,并且链接通过给出详细信息如何做到这一点来支持答案...... –

+0

如果您尚不知道,则无法在不咨询外部资源的情况下使用*此答案串替换操作是什么。在存在报价问题时,这也不是一个好的答案。 – chepner

0

我假设的'在你的命令字符串是要假设你的变量“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') 
+0

虽然它会起作用,但这是一个坏习惯。包含在命令行中的值应该被正确地转义,或者命令应该在Python方面被分割为令牌。如果's'来自不可信来源,则可能是'; rm -rf /;' – viraptor

+0

@viraptor我同意转义,但它看起来像变量是OP的脚本中的一个常量,因此可以安全地执行快速版本。作为一个技术性问题,'rm -rf /'不起作用(我测试了它),因为rm不会让你删除root,所以你需要'rm -rf/*'。即使这样,也有一些文件不会让你删除,但这会使操作系统几乎无法使用。 – Cody

+1

我知道它不工作 - 这就是为什么我总是使用破碎版本的例子:) – viraptor

4

使用标准的子模块:

import subprocess 
s = 5 
cmd = ['stress', '-c', '5', '-i', '1', '-m', '1', 
     '--vm-bytes', '128M', '-t', str(s)] 
subprocess.call(cmd) 

使用子流程模块,可以使每个参数分别独立传递。你只需要将它们转换为字符串。

+2

如果's'的值本身包含双引号,则第一种方法将不起作用。第二种方法确实是唯一可靠的方法。 – chepner

+0

当然,我也同意第二种方法更可靠。但是,就我而言,第一种方法是有效的。 –