2016-07-12 8 views
1

Ich verwende commands.getstatusoutput('some_terminal_command'), um die Ausgabe eines Terminalbefehls in einer Variablen zu speichern. Aber bin ich neugierig zu wissen, wie Python tatsächlich die Ausgabe vom Terminal bekommen? Hat Python einen Teil von 'Shell' oder so?Wie interagiert Python mit Linux?

+0

Es gibt keine Notwendigkeit, mit Terminal zu interagieren, die Schale zu verwenden. –

+2

Nicht verwandt mit Ihrer Frage, aber Sie sollten 'subprocess' anstelle von' commands' verwenden. Ersteres ist _way_ besser (und nicht veraltet). – mgilson

+0

@ AlexanderO'Mara, ich wollte den Code wissen, der sagt- "Hey Terminal, das ist der Befehl und gib mir die Ausgabe". –

Antwort

5

Letztendlich verwendet Ihr Aufruf zum Ausführen eines Befehls die Systemaufrufe fork and exec. Dies sind Funktionen, die vom Betriebssystem zur Verfügung gestellt werden und den meisten Programmiersprachen zugänglich sind, wodurch die Sprache einen neuen Prozess starten und seine Ausgabe erhalten kann. Es ist einer der grundlegenden Bausteine ​​vieler moderner Betriebssysteme.

Beachten Sie, dass nicht alle Betriebssysteme fork-exec haben, aber wenn dies nicht der Fall ist, haben sie eine vom System bereitgestellte Funktion zum Starten von Prozessen. Dies ist einer der Vorteile einer Hochsprache: Sie verbirgt plattformspezifische Funktionen hinter einer plattformübergreifenden API.

+0

Zur Klarstellung, dass fork-and-exec weder eine Shell noch ein Terminal benötigt. Auch: +1. – John1024

+0

ja! das ist, was ich gesucht habe :) –

+1

'fork' /' exec' ist spezifisch für Systeme im UNIX-Stil - Frage wurde mit Ubuntu getaggt, also war es vernünftig, sie zu erwähnen. Python ist jedoch portabel und hängt nicht von einem Betriebssystem mit diesen Funktionen ab. Windows ist ein Beispiel, bei dem Prozesse auf andere Weise erstellt werden ("CreateProcess" ist die API). – cdarke

1

Wenn Sie read the source Sie sehen, dass es den os.popen Aufruf verwendet. Interessant ist jedoch, dass os.popen nicht in dem os.py Modul definiert ist, das ich finden kann.

Schließlich und mit some help konnte ich die posixmodule source finden, welche überprüft, dass die Art und Weise, dass Python mit Linux in Wechselwirkung tritt, zumindest wenn PYCC_GCC definiert ist, über die popen Funktion ist. Dies bedeutet

Die Popen() - Funktion öffnet einen Prozess durch Erstellen einer Pipe, Forking und das Aufrufen der Shell.

Wenn Sie dieses Modul durchschauen Sie werden sehen, dass das Modul einige andere Ansätze für verschiedene Betriebssysteme definiert (wie OSX, NT, etc.)

+0

Zeile 1023 von 'os.py' in Python 3.5.2, Python 2.7.12 beginnt mit der Definition der verschiedenen um Zeile 658 –