os.system

___ qstnhdr ___ Python 'Quelle HOME /. Bashrc' mit os.system () ___ qstntxt ___

Ich schreibe ein Python-Skript (Linux), das einige Shell-Aliase hinzufügt (schreibt sie in %code% ) .

Um einen Alias ​​unmittelbar nach dem Schreiben verfügbar zu machen, sollte ich die folgende Bash-Funktion ausgeben:

%Vor%

%code% ist eine eingebaute Bash, also kann ich nicht einfach:

%Vor%

Wenn ich etwas wie:

versuche %Vor%

... wird das Skript einfrieren (genau wie es auf etwas wartet).

Irgendwelche Vorschläge?

    
___ answer3661672 ___

Was Sie wollen, ist nicht möglich. Ein Programm (Ihr Skript) kann die Umgebung des Aufrufers (der Shell, von der Sie es ausführen) nicht ändern.

Ein anderer Ansatz, der es Ihnen erlaubt, etwas in der Nähe zu tun, besteht darin, es in eine bash-Funktion zu schreiben, die im selben Prozess ausgeführt wird und den Aufrufer ändern kann. Beachten Sie, dass das Sourcing während der Laufzeit möglicherweise negative Nebenwirkungen haben kann, je nachdem, was der Benutzer in seinem bashrc hat.

    
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ answer45332323 ___

Ich hatte ein interessantes Problem, bei dem ich eine RC-Datei verwenden musste, um die korrekte Ausgabe in meinem Python-Skript zu erhalten.

Ich habe das schließlich in meiner Funktion verwendet, um die gleichen Variablen aus der Bash-Datei zu holen, die ich für die Quelle brauchte. Stellen Sie sicher, dass Sie os importiert haben.

%Vor%     
___ answer3668551 ___

Was Sie versuchen, ist unmöglich. oder besser: wie Sie es versuchen ist unmöglich.

  1. Ihr Bash-Befehl ist falsch. %code% führt %code% nicht aus. Es speichert nur den String "command" in der Variable %code% und lässt Sie dann zur Eingabeaufforderung fallen. Deshalb scheint das Python-Skript einzufrieren. Was Sie tun wollten, ist %code% .

  2. Warum beziehen Sie %code% ? Wäre es nicht genug, nur %code% zu finden?

  3. Auch wenn Sie Ihren bash-Befehl richtig verstanden haben, werden die Änderungen nur in der von python gestarteten Bash-Sitzung wirksam. Sobald diese Bash-Sitzung beendet ist und Ihr Python-Skript fertig ist, sind Sie wieder bei Ihrer ursprünglichen Bash-Sitzung. Alle Änderungen in der Bash-Sitzung, die mit Python begonnen wurde, gehen verloren.

Jedes Mal, wenn Sie etwas in der aktuellen Bash-Sitzung ändern möchten, müssen Sie dies innerhalb der aktuellen Bash-Sitzung tun. Die meisten Befehle, die Sie von bash aus ausführen (Systembefehle, Python-Skripte, sogar Bash-Skripte) erzeugen einen anderen Prozess, und alles, was Sie in diesem anderen Prozess tun, wird Ihre erste Bash-Sitzung nicht beeinflussen.

%code% ist ein Bash-Built-in, mit dem Sie Befehle innerhalb der aktuell laufenden Bash-Sitzung ausführen können, anstatt einen anderen Prozess zu erzeugen und die Befehle dort auszuführen. Das Definieren einer Bash-Funktion ist eine andere Möglichkeit, Befehle innerhalb der aktuell laufenden Bash-Sitzung auszuführen.

Siehe diese Antwort für weitere Informationen zum Sourcing und zur Ausführung.

was Sie tun können, um zu erreichen, was Sie wollen

Ändern Sie Ihr Python-Skript, um nur die notwendigen Änderungen an %code% vorzunehmen.

Bereiten Sie ein Bash-Skript vor, um Ihr Python-Skript auszuführen, und geben Sie dann %code% an.

%Vor%

Fügen Sie Ihrem %code% einen Alias ​​hinzu, um das Skript zu erhalten

%Vor%

Wenn Sie nun %code% in Ihre Bash-Eingabeaufforderung eingeben, wird sie durch %code% ersetzt und dann ausgeführt. Da %code% eine Bash-Datei ist, werden die Befehle innerhalb des Skripts innerhalb der aktuell laufenden Bash-Sitzung ausgeführt. Das Python-Skript wird weiterhin in einem anderen Prozess ausgeführt, aber der nachfolgende Befehl %code% wird in der aktuell ausgeführten Bash-Sitzung ausgeführt.

anderer Weg

Ändern Sie Ihr Python-Skript, um nur die notwendigen Änderungen an %code% vorzunehmen.

Bereiten Sie eine bash-Funktion vor, um Ihr Python-Skript auszuführen, und geben Sie dann %code% an.

%Vor%

Jetzt können Sie die Funktion wie folgt aufrufen: %code%

    
___ answer21040901 ___

[[funktionierende Lösung]]

%code%

%Vor%     
___ tag123osystem ___ os.system ist eine Python-Standardbibliotheksfunktion. Es führt das angegebene Zeichenfolgenargument als Befehl in einer Untershell aus. ___ tag123bash ___ Für Fragen zu Skripten, die für die Bash-Befehlsshell geschrieben wurden. Für Shell-Skripte mit Fehlern, überprüfen Sie diese bitte mit dem Shellcheck-Programm (oder im web-Shellcheck-Server unter https://shellcheck.net), bevor Sie hier posten. Fragen zur interaktiven Nutzung von Bash sind bei Super Usern eher Thema als bei Stack Overflow. ___
4
Antworten

Python 'Quelle HOME /. Bashrc' mit os.system ()

Ich schreibe ein Python-Skript (Linux), das einige Shell-Aliase hinzufügt (schreibt sie in HOME/.bash_aliases ) . Um einen Alias ​​unmittelbar nach dem Schreiben verfügbar zu machen, sollte ich die folgende Bash-Funktion ausgeben: %Vor%...
07.09.2010, 18:35