Traduire la sortie standard de la mémoire de fichier de chaîne de texte en anglais, comme si une commande d'impression ont été utilisés

StackOverflow https://stackoverflow.com//questions/9649058

Question

Je suis en cours d'exécution d'une commande rechercher un fichier particulier que je sais qu'il existe.Je voudrais obtenir le chemin d'accès à ce fichier, parce que je ne veux pas supposer que je sais où se trouve le fichier.Ma compréhension est que j'ai besoin de rediriger stdout, exécutez la commande et la capture de la sortie, re-crochet-up de sortie standard, puis récupérer les résultats.Le problème vient lorsque je récupère les résultats...Je ne peux pas déchiffrer:

import os
from cStringIO import StringIO
stdout_backup = sys.stdout #Backup standard output
stdout_output = StringIO() 
sys.stdout = stdout_output #Redirect standard output
os.system("find . -name 'foobar.ext' -print") #Find a known file
sys.stdout = stdout_backup #re-hook-up standard output as top priority
paths_to_file = stdout_ouput.get_value() #Retrieve results

Je trouve tous les chemins que je pouvais désirer, le problème, c'est que paths_to_file rendements ceci:

Out[9]: '\n\x01\x1b[0;32m\x02In [\x01\x1b[1;32m\x027\x01\x1b[0;32m\x02]: \x01\x1b[0m\x02\n\x01\x1b[0;32m\x02In [\x01\x1b[1;32m\x028\x01\x1b[0;32m\x02]: \x01\x1b[0m\x02'

Je n'ai aucune idée de quoi faire avec cela.Ce que je voulais, c'était quelque chose comme ce que la commande d'impression fournit:

./Work/Halpin Programs/Servers/selenium-server.jar

Comment puis-je faire cette sortie utilisable pour l'ouverture d'un fichier?Si je peux obtenir ce que la commande d'impression yeilds, je peux ouvrir le fichier que je veux.

Merci de réorienter la question si je suis en erreur.Merci!!!!

Était-ce utile?

La solution

Vous ne pouvez pas récupérer la sortie d'un sous-processus en changeant sys.stdout.Ce que vous avez capturé semble être certaines séquences d'échappement ANSI à partir de votre interactive de l'interpréteur Python (IPython?).

Pour obtenir la sortie d'une commande externe, vous devez utiliser subprocess.check_output():

paths = subprocess.check_output(["find", ".", "-name", "foobar.ext"])

Dans ce cas particulier, j'ai l'habitude de ne pas appeler une commande externe à tous, mais plutôt d'utiliser os.walk() pour trouver les fichiers à partir de la droite dans le Python processus.

Modifier:Voici comment l'utiliser os.walk() pour trouver les fichiers:

def find(path, pattern):
    for root, dirs, files in os.walk(path):
        for match in fnmatch.filter(files, pattern):
            yield os.path.join(root, match)

paths = list(find(".", "foobar.ext"))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top