6

私は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 番目の引数を変更する必要があると思いますが、その方法がわかりません! 私を助けることができる人はいますか???

4

4 に答える 4

5

ストリーム/ファイルを自分で行に分割する必要はありません。繰り返すだけです:

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
于 2009-03-16T15:48:11.587 に答える
1

InStream を削除し、ファイル オブジェクトのみを使用します。

あなたのコードが読むように:

for nextLine in f.readlines():
    .
    .
    .

ベルはそれを正しく持っています。

明確にするために、ファイル オブジェクトのデフォルトの反復動作は、次の行を返すことです。したがって、「for nextLine in f 」は「 for nextLine in f.readlines() 」と同じ結果になります。

詳細については、ファイル オブジェクトのドキュメントを参照してください: http://docs.python.org/library/stdtypes.html#bltin-file-objects

于 2009-03-16T16:45:49.843 に答える
0

sshを介して何かをしたい場合は、Python SSHモジュールを使用してみませんか?

于 2009-04-28T10:11:44.473 に答える
0

このページを試してみてください。私がこれまでに見つけたpopenに関する最良の情報....

http://jimmyg.org/blog/2009/working-with-python-subprocess.html

于 2011-10-03T17:20:53.863 に答える