Python, перенаправляющий поток Popen на функцию python - PullRequest
6 голосов
/ 16 марта 2009

Я новичок в программировании на 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

для уточнения информации, содержащейся в этих файлах. Функция имеет целью записать в 1 строку журналы, которые хранятся в этих файлах, используя 3 строки ... Функция отлично работает с файлами, считанными с моего локального компьютера, но я не могу понять, как подключиться к удаленному серверу и создать эти однострочные журналы, не сохраняя содержимое каждого файла в строку, а затем работая со строкой ... Команда, которую я использую для подключения к удаленной машине:

connection_out = Popen(['ssh', retList[0], 'cd '+retList[2]+'; cat'+fileName], stdout=PIPE).communicate()[0]

retList [0] и retList [2] - это user @ remote и имя папки, к которой я должен получить доступ

Спасибо всем заранее!

UPDATE:

Моя проблема в том, что мне сначала нужно установить ssh-соединение:

pr1=Popen(['ssh', 'siatc@lgssp101', '*~/XYZ/AAAAA/log_archive/00/MSG_090308_162648.gz*' ], stdout=PIPE).communicate()[0]

Все файлы, которые мне нужно открыть, хранятся в списке fileList [], часть из них сжата (.gz), а часть - просто текстовые файлы !! Я перепробовал все процедуры, которые вы показывали, прежде чем бот ничего не работал ... Я думаю, что я должен изменить третий аргумент функции Popen, но я не могу понять, как это сделать! Кто-нибудь может мне помочь ???

Ответы [ 4 ]

5 голосов
/ 16 марта 2009

Вам не нужно разбивать поток / файл на строки самостоятельно. Просто повторить:

for ln in f:
    # work on line in ln

Это должно работать одинаково хорошо для файлов (используя open () для file ()) и каналов (используя Popen). Используйте свойство stdout объекта popen для доступа к каналу, подключенному к stdout подпроцесса

Пример

from subprocess import Popen, PIPE
pp = Popen('dir', shell=True, stdout=PIPE)

for ln in pp.stdout:
    print '#',ln
1 голос
/ 16 марта 2009

Удалите InStream и просто используйте объект файла.

Чтобы ваш код читал:

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

Бер правильно понял.

Для пояснения, итеративное поведение файлового объекта по умолчанию - возвращать следующую строку. поэтому « для nextLine в f » даст вам те же результаты, что и « для nextLine в f.readlines () ».

Подробнее см. Документацию к объекту файла: http://docs.python.org/library/stdtypes.html#bltin-file-objects

0 голосов
/ 03 октября 2011

Попробуйте эту страницу, лучшую информацию о popen, которую я нашел до сих пор ....

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

0 голосов
/ 28 апреля 2009

Если вы хотите что-то сделать через ssh, почему бы не использовать модуль Python SSH ?

...