有没有一种方法可以在Python中运行bash eval命令?

3

尝试将旧的bash脚本转换为Python。问题在于我对bash了解不多。是否有与bash命令eval等效的Python命令? 在bash程序中,eval的用法如下:

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

这里的“file”是一个可执行文件。

如果没有等效的内容,有人能否提供一个合理的解释,说明eval在这里的作用是什么?如果这很基础,我很抱歉,但这是我第一次看bash脚本,我非常困惑。


我看不出在那行代码中使用eval的理由。实际上,也没有必要使用括号。据我所知,意图是在后台运行可执行文件。如果该行还有其他内容,请编辑问题。 - rici
我该如何在Python中运行以下命令:command: str = f"eval $(opam env --switch={switch} --set-switch)" res = subprocess.run(command.split(), check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - Charlie Parker
相关:https://discuss.ocaml.org/t/is-eval-opam-env-switch-switch-set-switch-equivalent-to-opam-switch-set-switch/10957 - Charlie Parker
输出的答案不是应该加上 .decode() 吗? - Charlie Parker
3个回答

1

我该如何在Python中运行以下命令:command: str = f"eval $(opam env --switch={switch} --set-switch)" res = subprocess.run(command.split(), check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - Charlie Parker
你难道没有为输出加上“.decode()”吗? - Charlie Parker

1

这里发生了几件事情。首先,您正在运行一个bash子shell,即括号部分。但可能这并不是那么重要,因为在该子shell内未更改任何变量。

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

而且您正在后台运行它。

所以让我们用Python将它们分解开来。如前所述,我们可以忽略子shell部分。

至于运行程序,os.system()subprocess.call相当于运行命令而无需捕获或更改输入或输出。

更常见的情况是,您需要捕获输出,因此相当于

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

is in Python是什么意思

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

请参见替换/bin/sh反引号获取更多信息。

最后,有关在后台运行的部分。最相似的匹配是subprocess.popen, 正如其他答案中提到的那样。还有os.fork(), 但它不适用于所有操作系统,尤其是Windows。您可能还想考虑使用线程。


在bash中,使用eval命令和直接键入命令有什么区别?本质上,这两者之间的区别是什么:eval "(/usr/path/exec/file) &"/usr/path/exec/file - Thomas Britton
对于给定的特定示例,只输入命令就可以正常工作。当您需要在字符串中构造包括参数的命令时,使用Eval。但是如果我有x='/usr/path/exec/file',您也不需要“eval”,而只需运行$x即可。eval还可用于取消引用带引号的字符串。 - rocky
我该如何在Python中运行以下命令:command: str = f"eval $(opam env --switch={switch} --set-switch)" res = subprocess.run(command.split(), check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - Charlie Parker
你是不是忘了在输出时加上 .decode() - Charlie Parker

-2

首先,我会阅读这里的评论以获取一个好的例子。

简而言之,eval命令正在评估输入与执行,但对于您的示例,如果您运行可执行文件,则与从CLI执行命令没有区别。'&'只是告诉进程在后台执行。查看这里以获取更多信息。

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

import subprocess

有三个命令可能值得考虑。

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

这取决于你想要多细致。对于你的代码,可以做如下操作:

import subprocess

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

这应该能让你开始了。check_output()将返回命令的任何输出,而Popen()则用于更精细的控制。


那最后一行不就相当于/usr/path/exec/file '&'吗?这样调用程序时不是在后台运行,而是将&作为参数传递给它了吗? - Alfe
你是不是忘了在输出时加上 .decode() - Charlie Parker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接