Wie kann ich mein Python-Programm direkt über die Shell ausführen?

10

Ich habe ein Drehbuch geschrieben. Wenn es startet, hört es nicht auf und es werden immer wieder Daten aus dem Internet abgerufen. Ich kann es so nennen:

cd /User/Desktop/project/internetScanner/
python3 main.py start

Aber ich möchte es direkt vom Terminal aus so anrufen, innerhalb des Ziels:

internetScanner start

Wie kann ich das machen?

Ted Wong
quelle
2
Ich frage mich, ob der Titel auf diesem geändert werden könnte ..
user606723
@ user606723 Sie können gerne eine Änderung vorschlagen, um sie ändern zu lassen. Der erste Titel "Wie kann mein Programm auf einer Shell ausgeführt werden?" war nicht sehr gut.
Slhck

Antworten:

27

Sie sollten wahrscheinlich die Datei umbenennen main.pyzu internetScanner. Erweiterungen auf * nix sind rein optional. Es sollte hier keine Rolle spielen.

mv main.py internetScanner

Fügen Sie dieser Datei gleich zu Beginn die folgende Zeile hinzu:

#!/usr/bin/env python3

Dadurch wird sichergestellt, dass die Shell bei der Ausführung der Datei python3den Inhalt interpretieren muss. Dies ist als Shebang bekannt . Machen Sie die Datei jetzt ausführbar:

chmod +x internetScanner

Sie können Ihr Programm jetzt von innen ausführen /User/Desktop/project/internetScanner/:

./internetScanner start

Ihr Programm wird im Vordergrund ausgeführt und läuft weiter, bis Sie Ctrl- drücken C. Wenn Sie dies nicht möchten, können Sie das Programm auch im Hintergrund starten, indem Sie nach dem Befehl ein kaufmännisches Und hinzufügen:

./internetScanner start &

Dadurch kann Ihr Programm ausgeführt werden, Sie können Ihre Shell jedoch weiterhin verwenden. Dies wird Jobsteuerung genannt, und es ist ein einfaches Tutorial über sie hier .

Wenn Sie das Programm jetzt von überall auf dem System ausführen möchten, müssen Sie das internetScannerVerzeichnis zu Ihrem Verzeichnis hinzufügen PATH: Was sind PATH und andere Umgebungsvariablen und wie kann ich sie festlegen oder verwenden?

slhck
quelle
Gute Antwort. Ich würde empfehlen, hinzuzufügen, dass er den Befehl möglicherweise mit einem kaufmännischen Und (&) beenden möchte, wenn er nicht darauf warten und / oder seine Ausgabe und seinen Fehlerstrom in eine Datei umleiten möchte.
Ben Hocking
@ BenHocking Danke, ich habe es der Antwort hinzugefügt.
Slhck
X &Trennt den Prozess nicht von der steuernden Shell, sondern hinterlegt den Prozess nur im Hintergrund. Wenn diese Shell beendet wird, wird das TERM-Signal an sie gesendet. Wenn Sie also nicht möchten, dass Sie trennen verwenden , detach ./internetScanner start.
Dan D.
1
@ DanD. ... oder nohup, disownoder at, et cetera. Wie trenne ich einen Prozess vollständig vom Terminal?
Slhck
Es kann erwähnenswert sein, dass es immer noch benannt main.pywerden kann, solange es mit internetScannerirgendwo in $ PATH verknüpft ist .
jdd
2

Angenommen, es werden keine weiteren Dateien /User/Desktop/project/internetScanner/benötigt, wenn Sie für einen einzelnen Benutzer installieren möchten, klicken Sie auf link ( ln -s) main.pyzu $HOME/bin/internetScanner. Sie müssen wahrscheinlich $HOME/binzuerst mkdir .

Wenn Sie sich das nächste Mal anmelden, $HOME/binwird dies wahrscheinlich Ihrem PATH hinzugefügt. Wenn Sie möchten, dass es für alle Benutzer verfügbar ist, kopieren Sie es nach /usr/local/bin.

Wenn es ausgeführt werden muss /User/Desktop/project/internetScanner/, beginnen Sie entweder mit dem Importieren osund dem Aufrufen

os.chdir('/User/Desktop/project/internetScanner/') 

oder erstellen Sie ein Startskript in $HOME/binoder /usr/local/bindas /User/Desktop/project/internetScanner/das Skript ändert und ausführt.

Perkins
quelle
0

alias internetScanner "python /User/Desktop/project/internetScanner/main.py"Fügen Sie die .aliases-Datei ein (für csh). alias internetScanner="python /User/Desktop/project/internetScanner/main.py"Geben Sie für bash .bashrc ein. Danach können Sie internetScanner von überall aus starten.

Excalibur
quelle
Ich habe noch nie von einer .aliasesDatei gehört. Ist das etwas Standard für Bash? oder müssen Sie es explizit in Ihrem beziehen .bashrc?
Kazark