尝试将旧的bash脚本转换为python。麻烦的是我对bash不太了解。是否有与bash命令eval相同的python命令? Eval在bash程序中使用如下:
eval "(/usr/path/exec/file) &"
其中"文件"是一个可执行文件。
如果没有相同的人可以提供关于eval在这里做什么的正确解释?我很抱歉,如果这是初步的,但这是我曾经看过的第一个bash脚本,我很困惑
答案 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()用于更细粒度的控制。