如何在python中运行多行bash命令?

如何在python中运行多行bash命令?,python,bash,subprocess,Python,Bash,Subprocess,我想在python程序中运行以下几行linuxbash命令 tail /var/log/omxlog | stdbuf -o0 grep player_new | while read i do Values=$(omxd S | awk -F/ '{print $NF}') x1="${Values}" x7="${x1##*_}" x8="${x7%.*}" echo ${x8} done 我知道对于单行命令,我们可以使用以下语法: subproce

我想在python程序中运行以下几行linux
bash
命令

tail /var/log/omxlog | stdbuf -o0 grep player_new | while read i
do
    Values=$(omxd S | awk -F/ '{print $NF}')
    x1="${Values}"
    x7="${x1##*_}"
    x8="${x7%.*}"
    echo ${x8}
done
我知道对于单行命令,我们可以使用以下语法:

subprocess.call(['my','command'])
但是,如果在多行中有多个命令,我如何使用
subprocess.call

引用:
使用子流程。检查输出(shell\u命令,shell=True)

我尝试了一些其他的例子,效果很好。

引用:
使用子流程。检查输出(shell\u命令,shell=True)


我尝试了一些其他的例子,效果很好。

这里有一个纯python解决方案,我认为它与您的
bash
相同:

logname = '/var/log/omxlog'
with open(logname, 'rb') as f:
    # not sure why you only want the last 10 lines, but here you go
    lines = f.readlines()[-10:]

for line in lines:
    if 'player_new' in line:
        omxd = os.popen('omxd S').read()
        after_ = omxd[line.rfind('_')+1:]
        before_dot = after_[:after_.rfind('.')]
        print(before_dot)

下面是一个纯python解决方案,我认为它与您的
bash
的功能相同:

logname = '/var/log/omxlog'
with open(logname, 'rb') as f:
    # not sure why you only want the last 10 lines, but here you go
    lines = f.readlines()[-10:]

for line in lines:
    if 'player_new' in line:
        omxd = os.popen('omxd S').read()
        after_ = omxd[line.rfind('_')+1:]
        before_dot = after_[:after_.rfind('.')]
        print(before_dot)


我不知道这是一个合适的解决方案,但在bash中,可以用分号替换多行。例如,
tail/var/log/omxlog | stdbuf-o0 grep plater | new |同时读取i;do Values=$(omxd S | awk-F/'{print$NF}');x1=“${Values}”等等。它当然不是很可读,但它应该可以工作。有什么理由不能运行bash脚本吗?为什么不能将其放在脚本中呢?这篇文章中有一些关于使用subprocess.pipe的好东西。另一个选项可能是查看python结构库,它有各种用于执行本地和远程代码的选项。我不想在python中调用外部脚本,因为访问python内部的I/O SPI外围设备。为什么不直接在python中读取
/var/log/omxlog
并执行
omxd
bash
在这里似乎没有必要。我不知道这是一个合适的解决方案,但在bash中,您可以用分号替换多行。例如,
tail/var/log/omxlog | stdbuf-o0 grep plater | new |同时读取i;do Values=$(omxd S | awk-F/'{print$NF}');x1=“${Values}”等等。它当然不是很可读,但它应该可以工作。有什么理由不能运行bash脚本吗?为什么不能将其放在脚本中呢?这篇文章中有一些关于使用subprocess.pipe的好东西。另一个选项可能是查看python结构库,它有各种用于执行本地和远程代码的选项。我不想在python中调用外部脚本,因为访问python内部的I/O SPI外围设备。为什么不直接在python中读取
/var/log/omxlog
并执行
omxd
bash
在这里似乎没有必要。谢谢@stephernauch的回答。这是我在bash上的第一个问题:它可能有助于实现准确的python解决方案。非常感谢您的时间和支持。@Omid1989-OH,您在上面的示例中省略了
-f
。。。。是的,我删除了
-f
,因为如果收到某个代码,我想通过SPI发送
x8
变量。(覆盆子皮3)谢谢Stephernauch。
omxd S
的输出类似于播放0/22/myfolder/F02\u Car\u 101.mp4
。这个python代码是否与前面的
一样获得
101
!!?谢谢@stephernauch。我修改了你的代码。现在它工作得很好。谢谢。谢谢@Stephernauch的回答。这是我在bash上的第一个问题:它可能有助于实现准确的python解决方案。非常感谢您的时间和支持。@Omid1989-OH,您在上面的示例中省略了
-f
。。。。是的,我删除了
-f
,因为如果收到某个代码,我想通过SPI发送
x8
变量。(覆盆子皮3)谢谢Stephernauch。
omxd S
的输出类似于播放0/22/myfolder/F02\u Car\u 101.mp4
。这个python代码是否与前面的
一样获得
101
!!?谢谢@stephernauch。我修改了你的代码。现在它工作得很好。谢谢。有没有类似的方法通过fabric api执行这样的shell命令?根据许多消息来源,这是一个相当棘手的问题,而且没有太多的细节。有没有类似的方法通过fabric api来执行这样的shell命令?根据许多消息来源,这是相当棘手的,没有得到太多的细节。