2017-02-14 4 views
0

Ich habe einige Befehle in einer Datei, die ich in Python lese und mit subprocess.Popen ausführe. Wenn Sie die Methode splitlines() ausführen, hängt die Anzahl der produzierten Zeilen von der Breite meines Terminalbildschirms ab. Die Befehle in der Datei sind:Python-Splitlinien führen zu Änderungen aufgrund der Bildschirmgröße des Terminals?

CREATE EXTERNAL TABLE tableforview (name string, dob string) STORED AS PARQUET LOCATION 'location';

Es sind keine Zeilenumbrüche in der Datei; Es ist alles in einer Zeile getippt.

hivep = subprocess.Popen("beeline -u 'connectionstring' --force=true --outputformat=csv2 --showWarnings=false -f hivetest", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 
(output, err) = hivep.communicate() 

hivequeryList = [] 
hivequery = "" 

for line in output.splitlines(): 
    print(line) 

Allerdings, wenn ich die Ausgabe von Teilungslinien() -Methode Zeile für Zeile zu drucken, erhalte ich zwei Linien oder drei Zeilen je nachdem, wie groß mein Terminal-Bildschirm ist.

Ich lese die Trennlinien in ein Wörterbuch. Was ich erwarten würde ist, dass der Schlüssel des Wörterbuchs die gesamte create-Abfrage und den Wert enthält, der das Ergebnis enthält. Aber was geschieht, ist die Abfrage wird immer abgeschnitten, wie so

{"CREATE EXTERNAL TABLE tableforview (name string, dob string) STORED AS PARQUE" : "T LOCATION 'location';"}

Und die Stelle, an der die Grenzänderungen erfolgen je nachdem, wie breit mein Terminal-Bildschirm ist.

Ich weiß nicht, warum meine Terminal-Bildschirmbreite beim Lesen aus einer Datei wichtig sein sollte. Würde jede Einsicht schätzen.

+0

Möglicherweise gibt es einige Umgebungsvariablen, die die Terminalbreite bestimmen. Daher versucht der Prozess, den Sie gerade öffnen, möglicherweise, seine Ausgaben entsprechend zu formatieren. Vielleicht versuchen Sie 'stdout =' und 'stdin =' Parameter zu verwenden, wenn Sie 'Popen' verwenden? –

+0

Können Sie die erwartete Ausgabe und was wird tatsächlich gedruckt werden? –

+0

Ich verwende stdout und stdin Parameter in Popen. Hat die erwartete Ausgabe gepostet. – covfefe

Antwort

1

In dem Moment, in dem Sie die print verwenden, wird Ihre Bildschirmbreite verwendet, um Ihren Inhalt zu drucken. Wenn Sie später die Größe ändern, hat der Druck bereits seine Berechnungen durchgeführt.

+0

Ich lese die Trennlinien in ein Wörterbuch. Was ich erwarten würde ist, dass der Schlüssel des Wörterbuchs die gesamte create-Abfrage und den Wert enthält, der das Ergebnis enthält. Aber was passiert ist, wird die Abfrage abgeschnitten, so {{CREATE EXTERNAL TABLE tableforview (Name Zeichenfolge, dob Zeichenfolge) gespeichert als PARQUE ":" T LOCATION 'Ort'; "}. Und der Ort, an dem diese Unterbrechung auftritt, hängt davon ab, wie breit mein Terminalbildschirm ist. Bitte siehe oben Bearbeiten. – covfefe

+0

Ich glaube nicht, dass das so funktioniert. Print gibt nur aus, was Sie ihm im angegebenen Stream geben (standardmäßig 'sys.stdout'), das Terminal bestimmt dann, wo die Ausgabezeilen aufgeteilt werden sollen (dh wo ein' \ n' in die Ausgabe eingefügt werden soll). Wenn Sie die Größe des Terminals ändern, wird es nur noch einmal berechnet. Print selbst hat keine Ahnung von der Terminalbreite. Sie können einen beliebigen anderen Stream angeben, der sich genau so verhält. –

+0

@ BłażejMichalik es hängt vom Terminal ab, einige werden Ihren Text nicht neu berechnen. Aber die Art, wie ich es gesagt habe, war so, als wäre der Druck dafür verantwortlich, mein Schlechter –

Verwandte Themen