Python, redirige le flux de Popen vers une fonction python
-
19-08-2019 - |
Question
Je suis nouveau dans la programmation python. J'ai ce problème: j'ai une liste de fichiers texte (compressés et non compressés) et j'ai besoin de: - connectez-vous au serveur et ouvrez-les - après l'ouverture du fichier, je dois prendre son contenu et le transmettre à une autre fonction python que j'ai écrite
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
pour élaborer les informations contenues dans ces fichiers. La fonction a pour but d’écrire en 1 ligne les journaux stockés dans ces fichiers sur 3 lignes ... La fonction fonctionne correctement pour les fichiers lus à partir de mon ordinateur local, mais je ne sais pas comment me connecter à un serveur distant. créez ces journaux d’une ligne sans stocker le contenu de chaque fichier dans une chaîne, puis utilisez cette chaîne ... La commande que j’utilise pour me connecter à la machine distante est la suivante:
connection_out = Popen(['ssh', retList[0], 'cd '+retList[2]+'; cat'+fileName], stdout=PIPE).communicate()[0]
retList [0] et retList [2] sont l'utilisateur @ distant et le nom du dossier auquel je dois accéder
Merci d'avance à tous!
UPDATE:
Mon problème est que je dois d'abord établir une connexion ssh:
pr1=Popen(['ssh', 'siatc@lgssp101', '*~/XYZ/AAAAA/log_archive/00/MSG_090308_162648.gz*' ], stdout=PIPE).communicate()[0]
Tous les fichiers que je dois ouvrir sont stockés dans une liste, fileList [], dont une partie est compressée (.gz) et une partie ne sont que des fichiers texte !! J'ai essayé toutes les procédures que vous avez montrées avant que rien ne marche ... Je pense que je dois modifier le troisième argument de la fonction Popen mais je ne peux pas comprendre comment le faire! Y a-t-il quelqu'un qui peut m'aider ???
La solution
Vous n'êtes pas obligé de scinder le flux / fichier en lignes vous-même. Il suffit de itérer:
for ln in f:
# work on line in ln
Cela devrait fonctionner aussi bien pour les fichiers (en utilisant open () pour file ()) et les tubes (en utilisant Popen). Utilisez la propriété stdout
de l'objet popen pour accéder au canal connecté à stdout du sous-processus
Exemple
from subprocess import Popen, PIPE
pp = Popen('dir', shell=True, stdout=PIPE)
for ln in pp.stdout:
print '#',ln
Autres conseils
Supprimez InStream et utilisez simplement l'objet fichier.
Pour que votre code se lise:
for nextLine in f.readlines():
.
.
.
Ber a raison.
Pour clarifier, le comportement par défaut de l'itération d'un objet fichier est de renvoyer la ligne suivante. donc " pour nextLine in f " vous donnera les mêmes résultats que " pour NextLine dans f.readlines () ".
Voir la documentation de l'objet fichier pour plus de détails: http: // docs .python.org / library / stdtypes.html # objets-fichier-bltin
Si vous voulez faire quelque chose via ssh, pourquoi ne pas utiliser le le module SSH Python ?
Essayez cette page, meilleure information sur Popen que j'ai trouvée jusqu'à présent ....
http://jimmyg.org/blog/2009/working- with-python-subprocess.html