2016-03-22 2 views
2

Ich bin ein Bash-Skript in Python (3.4.3) mit subprocess Aufruf:

import subprocess as sp 
res = sp.check_output("myscript", shell=True) 

und myscript enthält eine Zeile:

ps -ef | egrep somecommand 

Es gab nicht das gleiche Ergebnis als wenn myscript direkt in einem Bash Shell-Fenster aufgerufen wird. Nach viel Basteln stellte ich fest, dass, wenn mein Skript in Python aufgerufen wird, das Stdout von "ps -ef" durch den aktuellen $ COLUMNS-Wert des Shell-Fensters abgeschnitten wurde, bevor es an "egrep" weitergeleitet wurde. Für mich ist das verrückt, denn einfach durch die Größenänderung des Shell-Fensters kann der Befehl andere Ergebnisse liefern!

ich es geschafft, zu „lösen“ das Problem env Argument der subprocess Anruf, indem ein breit genug SÄULEN angeben:

res = sp.check_output("myscript", shell=True, env={'COLUMNS':'100'}) 

Dies ist jedoch für mich sehr schmutzig aussieht und ich verstehe nicht, Warum findet die Kürzung nur im Python-Subprozess statt, aber nicht in einer Bash-Shell? Ehrlich gesagt bin ich erstaunt, dass dieses Verhalten im offiziellen Python-Dokument nicht dokumentiert ist, es sei denn, es handelt sich tatsächlich um einen Fehler - ich benutze Python 3.4.3. Was ist der richtige Weg, um dieses seltsame Verhalten zu vermeiden?

+1

ohne Bezug: andere Umgebungsvariablen erhalten Sie 'env = dict (os.environ, COLUMNS = '100') verwenden könnte' statt 'env = { 'columns': '100'}' – jfs

Antwort

4

shoud Sie -ww verwenden, von man ps:

-w

Breite ausgegeben. Verwenden Sie diese Option zweimal für unbegrenzte Breite.

+0

Danke, so es war eigentlich ps, das seine Ausgabe basierend auf dem aktuellen $ COLUMNS abschneidet - warum schneidet es nicht ab, wenn es direkt im bash Shell-Fenster aufgerufen wird? –

+0

Es passiert auch in bash, versuchen: 'COLUMNS = 8 ps -ef' und Sie werden abgeschnittene Ausgabe sehen –

+0

' COLUMNS' wird normalerweise nicht exportiert, es wird von der Shell festgelegt. Im interaktiven Modus wird auf die richtige Größe eingestellt. Siehe Option 'setwinsize' in' man bash'. – cdarke