Python、PopenのストリームをPython関数にリダイレクト
-
19-08-2019 - |
質問
Pythonプログラミングは初めてです。 この問題があります:テキストファイルのリスト(圧縮されているかどうかにかかわらず)があります。 -サーバーに接続して開きます -ファイルを開いた後、彼のコンテンツを取得して、作成した別のpython関数に渡す必要があります
def readLogs (fileName):
f = open (fileName, 'r')
inStream = f.read()
counter = 0
inStream = re.split('\n', inStream) # Create a 'list of lines'
out = "" # Will contain the output
logInConst = "" # log In Construction
curLine = "" # Line that I am working on
for nextLine in inStream:
logInConst += curLine
curLine = nextLine
# check if it is a start of a new log && check if the previous log is 'ready'
if newLogRegExp.match(curLine) and logInConst != "":
counter = counter + 1
out = logInConst
logInConst = ""
yield out
yield logInConst + curLine
def checkFile (regExp, fileName):
generatore = readLogs(fileName)
listOfMatches=[]
for i in generatore: #I'm now cycling through the logs
# regExp must be a COMPILE regular expression
if regExp.search(i):
listOfMatches.append(i)
return listOfMatches
これらのファイルに含まれる情報を詳述するため。 この関数は、3行を使用してそれらのファイルに保存されているログを1行だけで書き込むことを目的としています。各ファイルのコンテンツを文字列に保存せずにこれらの1行のログを作成し、文字列を操作します...リモートマシンへの接続に使用するコマンドは次のとおりです。
connection_out = Popen(['ssh', retList[0], 'cd '+retList[2]+'; cat'+fileName], stdout=PIPE).communicate()[0]
retList [0]およびretList [2]はuser @ remoteおよびアクセスする必要があるフォルダー名です
事前に感謝します!
更新:
私の問題は、最初にssh接続を確立する必要があることです:
pr1=Popen(['ssh', 'siatc@lgssp101', '*~/XYZ/AAAAA/log_archive/00/MSG_090308_162648.gz*' ], stdout=PIPE).communicate()[0]
開く必要があるすべてのファイルはリストfileList []に保存され、その一部は圧縮(.gz)され、一部は単なるテキストファイルです!!ボットが機能しない前に示したすべての手順を試してみました... Popen関数の3番目の引数を変更すると思いますが、その方法はわかりません。私を助けることができる人はいますか?
解決
ストリーム/ファイルを自分で行に分割する必要はありません。繰り返します:
for ln in f:
# work on line in ln
これは、ファイル(file()にopen()を使用)とパイプ(Popenを使用)で同様に機能するはずです。 popenオブジェクトのstdout
プロパティを使用して、サブプロセスのstdoutに接続されているパイプにアクセスします
例
from subprocess import Popen, PIPE
pp = Popen('dir', shell=True, stdout=PIPE)
for ln in pp.stdout:
print '#',ln
他のヒント
InStreamを削除して、ファイルオブジェクトを使用します。
コードが読み取れるように:
for nextLine in f.readlines():
.
.
.
Berは正しい。
明確にするために、ファイルオブジェクトのデフォルトの反復動作は次の行を返すことです。 <!> quot; fのnextLineの場合 <!> quot; <!> quot; f.readlines()のnextLine() <!> quot;と同じ結果が得られます。
詳細については、ファイルオブジェクトのドキュメントを参照してください: http:// docs .python.org / library / stdtypes.html#bltin-file-objects
sshで何かをしたい場合、 Python SSHモジュールを使用してみませんか?
>このページを試してみてください、私がこれまでに見つけたポペンに関する最良の情報....
http://jimmyg.org/blog/2009/working- with-python-subprocess.html