尝试将旧的bash脚本转换为Python。问题在于我对bash了解不多。是否有与bash命令eval等效的Python命令? 在bash程序中,eval的用法如下:
eval "(/usr/path/exec/file) &"
这里的“file”是一个可执行文件。
如果没有等效的内容,有人能否提供一个合理的解释,说明eval在这里的作用是什么?如果这很基础,我很抱歉,但这是我第一次看bash脚本,我非常困惑。
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上的文档。
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这里发生了几件事情。首先,您正在运行一个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。您可能还想考虑使用线程。
eval "(/usr/path/exec/file) &"
和/usr/path/exec/file
- Thomas Brittonx='/usr/path/exec/file'
,您也不需要“eval”,而只需运行$x
即可。eval还可用于取消引用带引号的字符串。 - rockycommand: 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首先,我会阅读这里的评论以获取一个好的例子。
简而言之,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
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