Pitão, redireccionando o fluxo de Popen para uma função pitão
-
19-08-2019 - |
Pergunta
Eu sou novo em programação python. Eu tenho esse problema: Eu tenho uma lista de arquivos de texto (tanto comprimido e não) e eu preciso: - conectar ao servidor e abri-los - após a abertura do arquivo, eu preciso tomar o seu conteúdo e passá-lo para outra função python que escrevi
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
a fim de elaborar a informação contida nesses arquivos. A função tem o objetivo de gravação em apenas 1 linha os registros que são armazenados nesses arquivos usando 3 linhas ... A função está funcionando bem em arquivos lidos da minha máquina local, mas eu não consigo descobrir como se conectar a um servidor remoto e criar esses logs de uma linha sem armazenar o conteúdo de cada arquivo em uma string e, em seguida, trabalhar com a corda ... o comando que eu uso para se conectar à máquina remota é:
connection_out = Popen(['ssh', retList[0], 'cd '+retList[2]+'; cat'+fileName], stdout=PIPE).communicate()[0]
retList [0] e retList [2] é o usuário @ remoto e o nome da pasta que tenho de acesso
Obrigado a todos antecipadamente!
UPDATE:
O meu problema é que eu tenho que estabelecer uma conexão ssh primeiro:
pr1=Popen(['ssh', 'siatc@lgssp101', '*~/XYZ/AAAAA/log_archive/00/MSG_090308_162648.gz*' ], stdout=PIPE).communicate()[0]
Todos os arquivos que eu preciso abrir são armazenados em uma lista, fileList [], parte delas são compactados (.gz) e parte são apenas arquivos de texto !! Eu tentei todos os procedimentos que u mostrou antes bot nada funcionou ... Eu acho que eu mus modificar o terceiro argumento da função Popen mas eu não consigo descobrir como fazê-lo! Existe alguém que pode me ajudar ???
Solução
Você não tem que separar a corrente / arquivo em linhas de si mesmo. Apenas iterate:
for ln in f:
# work on line in ln
Isso deve funcionar igualmente bem para arquivos (usando open () para o arquivo ()) e tubos (usando Popen). Use a propriedade stdout
do objeto popen ao acesso do tubo conectado a stdout do subprocesso
from subprocess import Popen, PIPE
pp = Popen('dir', shell=True, stdout=PIPE)
for ln in pp.stdout:
print '#',ln
Outras dicas
Remova InStream e usar apenas o objeto de arquivo.
Assim que o código seria:
for nextLine in f.readlines():
.
.
.
Ber tem direito.
Para esclarecer, o comportamento iteração padrão de um objeto de arquivo é retornar a próxima linha. por isso " para nextLine em f " irá dar-lhe os mesmos resultados como " para nextLine em f.readlines () ".
Consulte a documentação do objeto de arquivo para obter mais detalhes: http: // docs .python.org / biblioteca / stdtypes.html # bltin-file-objetos
Se você quer fazer algo via ssh, por que não usar o Python SSH módulo ?
Tente esta página, melhor informação sobre popen eu encontrei até agora ....
http://jimmyg.org/blog/2009/working- com-python-subprocess.html