質問

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top