Übersetzen Sie die Standard-Ausgabespeicherdatei in eine Zeichenfolge mit englischem Text, als ob ein Druckbefehl verwendet würde

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

Frage

Ich führe einen Suchbefehl für eine bestimmte Datei aus, von der ich weiß, dass sie existiert.Ich möchte den Pfad zu dieser Datei erhalten, da ich nicht davon ausgehen möchte, dass ich weiß, wo sich die Datei befindet.Soweit ich weiß, muss ich stdout umleiten, den Befehl ausführen und die Ausgabe erfassen, die Standardausgabe erneut anschließen und dann die Ergebnisse abrufen.Das Problem tritt auf, wenn ich die Ergebnisse abrufe ...Ich kann sie nicht entziffern:

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

Ich finde alle Pfade, die ich mir wünschen kann. Das Problem ist, dass paths_to_file Folgendes ergibt:

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'

Ich habe keine Ahnung, was ich damit machen soll.Was ich wollte, war so etwas wie das, was der Druckbefehl bereitstellt:

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

Wie mache ich diese Ausgabe zum Öffnen einer Datei nutzbar?Wenn ich bekomme, was der Druckbefehl liefert, kann ich die gewünschte Datei öffnen.

Bitte orientieren Sie die Frage neu, wenn ich falsch liege.Danke schön!

War es hilfreich?

Lösung

Sie können die Ausgabe eines Unterprozesses nicht durch Ändern erfassen sys.stdout.Was Sie erfasst haben, scheint einige ANSI-Escape-Sequenzen aus Ihrem interaktiven Python-Interpreter (IPython?) zu sein.

Um die Ausgabe eines externen Befehls zu erhalten, sollten Sie verwenden subprocess.check_output():

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

In diesem speziellen Fall würde ich normalerweise überhaupt keinen externen Befehl aufrufen, sondern lieber verwenden os.walk() um die Dateien direkt im Python-Prozess zu finden.

Bearbeiten:Hier erfahren Sie, wie Sie es verwenden os.walk() So finden Sie die Dateien:

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"))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top