亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用管道鏈接幾個Popen命令

用管道鏈接幾個Popen命令

飲歌長嘯 2019-11-30 14:57:09
我知道如何使用cmd = subprocess.Popen和subprocess.communicate運行命令。大多數情況下,我將使用shlex.split標記的字符串用作Popen的'argv'參數?!?ls -l”的示例:import subprocessimport shlexprint subprocess.Popen(shlex.split(r'ls -l'), stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()[0]但是,管道似乎不起作用...例如,以下示例返回注釋:import subprocessimport shlexprint subprocess.Popen(shlex.split(r'ls -l | sed "s/a/b/g"'), stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()[0]你能告訴我我做錯了嗎?謝謝
查看完整描述

3 回答

?
LEATH

TA貢獻1936條經驗 獲得超7個贊

我認為您想在此處實例化兩個單獨的Popen對象,一個用于“ ls”,另一個用于“ sed”。您需要將第一個Popen對象的stdout屬性作為stdin參數傳遞給第二個Popen對象。


例:


p1 = subprocess.Popen('ls ...', stdout=subprocess.PIPE)

p2 = subprocess.Popen('sed ...', stdin=p1.stdout, stdout=subprocess.PIPE)

print p2.communicate()

如果您有更多命令,則可以保持鏈接的方式:


p3 = subprocess.Popen('prog', stdin=p2.stdout, ...)

請參閱子流程文檔以獲取有關如何使用子流程的更多信息。


查看完整回答
反對 回復 2019-11-30
?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

我已經做了一些功能來幫助管道,希望對您有所幫助。它將根據需要鏈接Popens。


from subprocess import Popen, PIPE

import shlex


def run(cmd):

  """Runs the given command locally and returns the output, err and exit_code."""

  if "|" in cmd:    

    cmd_parts = cmd.split('|')

  else:

    cmd_parts = []

    cmd_parts.append(cmd)

  i = 0

  p = {}

  for cmd_part in cmd_parts:

    cmd_part = cmd_part.strip()

    if i == 0:

      p[i]=Popen(shlex.split(cmd_part),stdin=None, stdout=PIPE, stderr=PIPE)

    else:

      p[i]=Popen(shlex.split(cmd_part),stdin=p[i-1].stdout, stdout=PIPE, stderr=PIPE)

    i = i +1

  (output, err) = p[i-1].communicate()

  exit_code = p[0].wait()


  return str(output), str(err), exit_code


output, err, exit_code = run("ls -lha /var/log | grep syslog | grep gz")


if exit_code != 0:

  print "Output:"

  print output

  print "Error:"

  print err

  # Handle error here

else:

  # Be happy :D

  print output


查看完整回答
反對 回復 2019-11-30
?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

shlex 僅根據shell規則拆分空間,但不處理管道。


但是,它應該以這種方式工作:


import subprocess

import shlex


sp_ls = subprocess.Popen(shlex.split(r'ls -l'), stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE)

sp_sed = subprocess.Popen(shlex.split(r'sed "s/a/b/g"'), stdin = sp_ls.stdout, stdout = subprocess.PIPE, stderr = subprocess.PIPE)

sp_ls.stdin.close() # makes it similiar to /dev/null

output = sp_ls.communicate()[0] # which makes you ignore any errors.

print output

根據help(subprocess)的


Replacing shell pipe line

-------------------------

output=`dmesg | grep hda`

==>

p1 = Popen(["dmesg"], stdout=PIPE)

p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)

output = p2.communicate()[0]

高溫超導


查看完整回答
反對 回復 2019-11-30
  • 3 回答
  • 0 關注
  • 394 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號