管道命令在python结构中不起作用

管道命令在python结构中不起作用,python,bash,pipe,fabric,pipelining,Python,Bash,Pipe,Fabric,Pipelining,我试图通过管道传输多个bash命令,从列出图像名称的命令的输出中提取图像名称,但它不起作用-它会吐出一团文本,就像一步一步地做一样 使用管道的代码: @task def update(): image_name = sudo('/os-updater --list | grep X86-64_ | sed "s/XXX/UEK4/" | tail -1') print("IMAGE NAME: "+image_name) 输出: user@system:host-updater

我试图通过管道传输多个bash命令,从列出图像名称的命令的输出中提取图像名称,但它不起作用-它会吐出一团文本,就像一步一步地做一样

使用管道的代码:

@task
def update():
    image_name = sudo('/os-updater --list | grep X86-64_ | sed "s/XXX/UEK4/" | tail -1')
    print("IMAGE NAME: "+image_name)
输出:

user@system:host-updater$ ./hu -R host-name update
[host-name] Executing task 'update'
[host-name] sudo: /os-updater --list | grep X86-64_ | sed "s/XXX/UEK4/" | tail -1
[host-name] out: 2018-01-11 23:33:28,628 INFO ==> os-updater 1.3.3 started
[host-name] out: 2018-01-11 23:33:28,629 INFO --listsnapshots:True
[host-name] out: 2018-01-11 23:33:28,705 INFO Exit 0
[host-name] out:   X86-64_20171201.01_UEK4
[host-name] out: 

IMAGE NAME: 2018-01-11 23:33:28,628 INFO ==> os-updater 1.3.3 started
2018-01-11 23:33:28,629 INFO --listsnapshots:True
2018-01-11 23:33:28,705 INFO Exit 0
  X86-64_20171201.01_UEK4

Done.
user@system:host-updater$ ./hu -R host-name update
[host-name] Executing task 'update'
[host-name] sudo: /os-updater --list
[host-name] out: 2018-01-11 23:36:11,752 INFO ==> os-updater 1.3.3 started
[host-name] out: 2018-01-11 23:36:11,753 INFO --listsnapshots:True
[host-name] out: 2018-01-11 23:36:11,847 INFO Exit 0
[host-name] out: Snapshots:
[host-name] out:   X86-64_20171101.01_XXX
[host-name] out:   X86-64_20171201.01_XXX
[host-name] out: Kernel trains: (XXX above)
[host-name] out:   UEK4
[host-name] out:   STOCK
[host-name] out: 

IMAGE NAME: X86-64_20171201.01_UEK4

Done.
不带pipleine的代码:

@task
def update():
    image_list = sudo("/os-updater --list")
    out = image_list.stdout
    for line in out.splitlines():
        if 'X86-64_' in line:
            image_name = line.replace("XXX", "UEK4").strip()

    print("IMAGE NAME: " + image_name)
输出:

user@system:host-updater$ ./hu -R host-name update
[host-name] Executing task 'update'
[host-name] sudo: /os-updater --list | grep X86-64_ | sed "s/XXX/UEK4/" | tail -1
[host-name] out: 2018-01-11 23:33:28,628 INFO ==> os-updater 1.3.3 started
[host-name] out: 2018-01-11 23:33:28,629 INFO --listsnapshots:True
[host-name] out: 2018-01-11 23:33:28,705 INFO Exit 0
[host-name] out:   X86-64_20171201.01_UEK4
[host-name] out: 

IMAGE NAME: 2018-01-11 23:33:28,628 INFO ==> os-updater 1.3.3 started
2018-01-11 23:33:28,629 INFO --listsnapshots:True
2018-01-11 23:33:28,705 INFO Exit 0
  X86-64_20171201.01_UEK4

Done.
user@system:host-updater$ ./hu -R host-name update
[host-name] Executing task 'update'
[host-name] sudo: /os-updater --list
[host-name] out: 2018-01-11 23:36:11,752 INFO ==> os-updater 1.3.3 started
[host-name] out: 2018-01-11 23:36:11,753 INFO --listsnapshots:True
[host-name] out: 2018-01-11 23:36:11,847 INFO Exit 0
[host-name] out: Snapshots:
[host-name] out:   X86-64_20171101.01_XXX
[host-name] out:   X86-64_20171201.01_XXX
[host-name] out: Kernel trains: (XXX above)
[host-name] out:   UEK4
[host-name] out:   STOCK
[host-name] out: 

IMAGE NAME: X86-64_20171201.01_UEK4

Done.
我不明白为什么第二种方法(字面上是一步一步地做相同的事情,没有管道)有效,但第一种方法却不能返回大量带有图像名称的文本。 我试过很多东西:

image_name = sudo('/opt/os-updater/bin/os-updater --list | grep X86-64_OL7_ | sed "s/XXX/UEK4/" | tail -1').stdout.strip() 
然后使用fabric隐藏选项运行命令,如
#with hide('output','running','warnings'):
。这些都不管用。
管道不起作用真是太奇怪了。非常感谢您的帮助。

管道是一个shell语法元素。您需要在shell中运行它:

sudo("/os-updater --list | sed -n '/X86-64_/s/XXX/UEK4/p' | tail -1", shell=True)

PS:我自由地将
grep
sed
命令组合成一个命令。

谢谢。但这也不行。它仍然返回那一团文本。尝试了以下方法:image_name=sudo(“/os updater--list | sed-n'/X86-64_/s/XXX/UEK4/p'| tail-1”,shell=True)打印(“image_name:+image_name”)获得相同的:IMAGE\u NAME:2018-01-12 18:58:52964 INFO==>os updater 1.3.3已启动2018-01-12 18:58:52965 INFO--listsnapshots:True 2018-01-12 18:58:53052 INFO退出0 X86-64\u 20171201.01\u UEK4