2017-07-25 21 views
0

私はsubprocessと対話していて、自分の入力の準備ができていることを検出しようとしています。私が抱えている問題は、readまたはreadline関数が、行末の '\ n'デリミタ、または降伏するEOFに依存していることです。このsubprocessは決して終了しないので、オブジェクトのようなファイルにはEOFはありません。私がオフにしたいキーワードにはその区切り文字が含まれていないので、readとreadline関数は決して降伏しません。たとえば:読み取り専用または読み込み専用のPythonカスタム区切り文字

'Doing something\n' 
'Doing something else\n' 
'input>' 

このプロセスが終了したことがないので、読み取りまたは読み取り行は、それが生成するために必要であることをEOFまたは\nを見ることはありません。

オブジェクトのようにこのファイルを読み取り、カスタム区切り文字をinput>に設定する方法はありますか?彼らはによって提供されていない場合は、データの大スワスをつかむことができなくなりますため、Pythonのデフォルトのバッファリングのポリシーに、残念ながら

def custom_readlines(handle, line_separator="\n", chunk_size=64): 
    buf = "" # storage buffer 
    while not handle.closed: # while our handle is open 
     data = handle.read(chunk_size) # read `chunk_size` sized data from the passed handle 
     if not data: # no more data... 
      break # break away... 
     buf += data # add the collected data to the internal buffer 
     if line_separator in buf: # we've encountered a separator 
      chunks = buf.split(line_separator) 
      buf = chunks.pop() # keep the last entry in our buffer 
      for chunk in chunks: # yield the rest 
       yield chunk + line_separator 
    if buf: 
     yield buf # return the last buffer if any 

+0

コードを表示できますか? (最小の小さな例) –

+0

この問題を解決するには、[mcve]が必要です。 –

+0

入力を一度に1文字ずつ読み込みます。 – Goyo

答えて

0

あなたは区切り文字を自分で独自のreadlines機能を実装して選択することができますあなたが呼んでいるプロセスですが、いつでもchunk_size1に設定して、入力文字を文字で読み取ることができます。

import subprocess 

proc = subprocess.Popen(["your", "subprocess", "command"], stdout=subprocess.PIPE) 

while chunk in custom_readlines(proc.stdout, ">", 1): 
    print(chunk) 
    # do whatever you want here... 

そして、それはあなたのサブプロセスSTDOUTから>にすべてをキャプチャする必要があります。だから、あなたの例のために、すべてを行う必要があります。このバージョンでは、区切り文字として複数の文字を使用することもできます。

+0

ありがとうございました!私は近いうちに上記の大まかな実装をしましたが、1つのchunk_sizeを使用するためにクリックしませんでした – wdoler

関連する問題