2010-03-08 5 views
9

Ich starte ein Python-Skript über die Befehlszeile (Bash) unter Linux. Ich muss Python öffnen, ein Modul importieren und Zeilen Code interpretiert haben. Die Konsole muss dann in Python bleiben (nicht beenden). Wie mache ich das?Importieren von Python-Modul aus der Bash

Ich habe einen Alias ​​wie dieser versucht:

alias program="cd /home/myname/programs/; python; import module; line_of_code" 

Aber das beginnt erst Python und die Befehle nicht ausgeführt werden (kein Modul Import, keine Zeile Code behandelt).

Was ist der richtige Weg, dies zu tun, vorausgesetzt, ich muss Python offen halten (nicht beenden), nachdem das Skript ausgeführt wurde? Vielen Dank!

Antwort

5

Eine einfache Möglichkeit, dies zu tun, ist mit der "Code" Modul:

python -c "import code; code.interact(local=locals())" 

Dies wird Sie in eine interaktive Shell fallen, wenn code.interact() aufgerufen wird . Das local Schlüsselwort-Argument zu interact wird verwandt, um den Standardnamespace für den Interpreter, der erstellt wird, vorzufüllen; Wir verwenden locals(), eine integrierte Funktion, die den lokalen Namespace als Wörterbuch zurückgibt.

Ihr Befehl würde wie folgt aussehen:

python -c "import mymodule, code; code.interact(local=locals())" 

, die Sie in einen Dolmetscher fällt, die die richtige Umgebung hat.

+0

Das funktioniert nur zur Hälfte. Ich habe mein Importmodul entweder vor oder nach dem 'Importcode' hinzugefügt, aber in der interaktiven Python-Konsole ist mein Modul nicht verfügbar. – Morlock

+1

Ich denke, das Code-Modul kann tun, was Sie wollen, aber Sie müssen die Umgebung wie folgt bootstrappen: python -c "importieren sys, code; code.interact (local = einheimische())" Das lässt mich auf einen Befehl Shell, die mich tun können: >>> print sys.argv [0] Ist das näher an dem, was Sie versuchen zu tun? –

+0

Großartig! Das macht den Job für mich. Mein eigenes Modul ist jetzt auch geladen (Import sys, code, mymodule; ...) Prost – Morlock

3

Beispiel:

python -c "import time ; print 'waiting 2 sec.'; time.sleep(2); print 'finished' " 
+1

@Karol Thx, aber ich muss in der Konsole innerhalb Python bleiben, da dies ein interaktives Skript. Ich habe die Frage bearbeitet, um das hinzuzufügen. – Morlock

+1

Wenn Sie innerhalb von Python bleiben müssen, starten Sie den Interpreter mit dem Flag "-i". – ChristopheD

+0

Ich versuchte mit der -i (mit oder ohne c-), aber ich bekomme ein: 'Python: kann Datei' Importmodul 'nicht öffnen: [Errno 2] Keine solche Datei oder Verzeichnis' – Morlock

6

Verwendung ein Unterprogramm statt alias

callmyprogram(){ 
    python -i -c "import time;print time.localtime()" 
} 
callmyprogram 
+0

@ ghostdog74 Ich benutze nie ein Unterprogramm vorher. Wo soll ich das hinstellen? In der .bashrc-Datei? (.bash_bashrc, weil ich Linux Mint verwende) Wie starte ich es dann? Danke. – Morlock

+0

können Sie es in ein beliebiges Skript einfügen. Da Sie '.bash_bashrc' haben, können Sie es dort ablegen. Wenn Sie die Unterroutine verwenden möchten, tun Sie einfach eine 'Quelle .bash_bashrc' – ghostdog74

+0

+ für die Kombination von' -i' und '-c', die das Problem des OPs löst. Während etwas in eine Funktion zu bringen nie schadet (für zusätzliche Flexibilität), würde ein Alias ​​hier genauso gut funktionieren. Eine Anmerkung zur Bash-Terminologie: 'Subroutine' wird als Überbegriff für _shell functions_ und _sourced scripts_ verwendet; Daher ist es besser, dies als _ [shell] function_ zu bezeichnen. – mklement0