Python, reindirizzando il flusso di Popen a una funzione python
-
19-08-2019 - |
Domanda
Sono nuovo nella programmazione di Python. Ho questo problema: ho un elenco di file di testo (sia compressi che non) e ho bisogno di: - connettersi al server e aprirli - dopo l'apertura del file, devo prendere il suo contenuto e passarlo a un'altra funzione Python che ho scritto
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
per elaborare le informazioni contenute in quei file. La funzione ha lo scopo di scrivere in una sola riga i registri che sono memorizzati in quei file usando 3 righe ... La funzione funziona perfettamente sui file letti dal mio computer locale ma non riesco a capire come connettermi a un server remoto e creare questi registri a una riga senza archiviare il contenuto di ciascun file in una stringa e quindi lavorare con la stringa ... Il comando che utilizzo per connettermi al computer remoto è:
connection_out = Popen(['ssh', retList[0], 'cd '+retList[2]+'; cat'+fileName], stdout=PIPE).communicate()[0]
retList [0] e retList [2] sono l'utente @ remoto e il nome della cartella a cui devo accedere
Grazie a tutti in anticipo!
UPDATE:
Il mio problema è che devo prima stabilire una connessione ssh:
pr1=Popen(['ssh', 'siatc@lgssp101', '*~/XYZ/AAAAA/log_archive/00/MSG_090308_162648.gz*' ], stdout=PIPE).communicate()[0]
Tutti i file che devo aprire sono memorizzati in un elenco, fileList [], parte di essi sono compressi (.gz) e parte sono solo file di testo !! Ho provato tutte le procedure che hai mostrato prima che il bot non funzionasse. Penso che dovrei modificare il terzo argomento della funzione Popen, ma non riesco a capire come farlo! C'è qualcuno che mi può aiutare ???
Soluzione
Non è necessario dividere il flusso / file in linee da soli. Basta iterare:
for ln in f:
# work on line in ln
Questo dovrebbe funzionare ugualmente bene per file (usando open () per file ()) e pipe (usando Popen). Utilizzare la proprietà stdout
dell'oggetto popen per accedere alla pipe connessa allo stdout del sottoprocesso
Esempio
from subprocess import Popen, PIPE
pp = Popen('dir', shell=True, stdout=PIPE)
for ln in pp.stdout:
print '#',ln
Altri suggerimenti
Rimuovi InStream e usa semplicemente l'oggetto file.
In modo che il tuo codice leggesse:
for nextLine in f.readlines():
.
.
.
Ber ha ragione.
Per chiarire, il comportamento di iterazione predefinito di un oggetto file è di restituire la riga successiva. quindi " per nextLine in f " ti darà gli stessi risultati di " per nextLine in f.readlines () " ;.
Per ulteriori informazioni, consultare la documentazione relativa all'oggetto file: http: // docs .python.org / library / stdtypes.html # bltin-file-oggetti
Se vuoi fare qualcosa tramite ssh, perché non utilizzare il modulo SSH Python ?
Prova questa pagina, le migliori informazioni su popen che ho trovato finora ....
http://jimmyg.org/blog/2009/working- con-python-subprocess.html