有没有办法在python中运行bash eval命令?

时间:2015-07-08 19:27:53

标签: python bash

尝试将旧的bash脚本转换为python。麻烦的是我对bash不太了解。是否有与bash命令eval相同的python命令? Eval在bash程序中使用如下:

eval "(/usr/path/exec/file) &"

其中"文件"是一个可执行文件。

如果没有相同的人可以提供关于eval在这里做什么的正确解释?我很抱歉,如果这是初步的,但这是我曾经看过的第一个bash脚本,我很困惑

3 个答案:

答案 0 :(得分:1)

使用subprocess.Popen以异步方式运行子进程

示例:

from subprocess import Popen
p = Popen(['/usr/path/exec/file'])

在子进程运行时执行其他操作,然后调用

p.terminate()

p.wait()

另请查看https://docs.python.org/2/library/subprocess.html#subprocess.Popen

上的文档

答案 1 :(得分:1)

有几件事情在那里发生。首先,您在bash子shell中运行,即括号部分。但可能这并不是那么重要,因为在子shell中没有变量被改变。

接下来,您正在运行程序,但文件描述符被复制,因此stdin,stdout和stderr是相同的。

你在后台运行它。

因此,让我们将它们分解为Python。如前所述,我们可以忽略子shell部分。

至于运行程序,os.system()subprocess.call相当于在不必捕获或更改输入或输出的情况下运行命令。

您经常需要捕获输出,因此相当于

 x=$(/path/to/exec/file)

在Python中是

 x = subprocess.check_output('/path/to/exec/file')

有关详细信息,请参阅Replacing /bin/sh backquote

最后,还有一些关于在后台运行的内容。为此,最等效的匹配是subprocess.popen,如其他答案之一所述。还有os.fork(),但这并不适用于所有操作系统,尤其是Windows。您可能还想考虑使用线程。

答案 2 :(得分:-1)

首先,我会通过评论here阅读一个很好的例子。

简而言之,eval命令正在评估输入与执行,但对于您的示例,如果您运行可执行文件,则与从CLI执行命令没有什么不同。 '&'只是告诉进程在后台执行。查看this了解更多信息。

要在python中执行CLI命令,您可以

import subprocess

您可能需要考虑三个命令。

subprocess.call()
output = subprocess.check_output()
subprocess.Popen()

取决于您想要的细粒度。对于您的代码,执行以下操作:

import subprocess

subprocess.call(["/usr/path/exec/file" , "&"])

应该让你去。 check_ouput()将返回命令的任何输出,而Popen()用于更细粒度的控制。