Python, перенаправление потока Popen на функцию python
Я новичок в программировании на 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] - это пользователь @ remote и имя папки, к которой я должен получить доступ
Спасибо всем заранее !
Обновление:
Моя проблема в том, что я должен установить SSH-соединение :
pr1=Popen(['ssh', 'siatc@lgssp101', '*~/XYZ/AAAAA/log_archive/00/MSG_090308_162648.gz*' ], stdout=PIPE).communicate()[0]
Все файлы, которые мне нужно открыть, хранятся в списке fileList [], часть из них сжата (.gz) и часть - это просто текстовые файлы !! Я перепробовал все процедуры, которые вы показывали до того, как бот ничего не работал ... Я думаю, что я могу изменить третий аргумент функции Popen, но я не могу понять, как это сделать ! Кто-нибудь может мне помочь ???
4 ответа:
Вам не нужно самостоятельно разбивать поток/файл на строки. Просто повторите:
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
Удалите InStream и просто используйте объект file.
Чтобы ваш код читался так:
for nextLine in f.readlines(): . . .
Бер прав.
Для уточнения, поведение итерации по умолчанию объекта file должно возвращать следующую строку. таким образом, "для nextLine в f" даст вам те же результаты, что и "для nextLine в f.readlines()".
Смотрите документацию по объекту file подробнее: http://docs.python.org/library/stdtypes.html#bltin-file-objects
Если вы хотите что-то сделать через ssh, почему бы не использовать модуль Python SSH?
Попробуйте эту страницу, лучшая информация о popen, которую я нашел до сих пор....
Http://jimmyg.org/blog/2009/working-with-python-subprocess.html