2012-04-03 8 views
6

Gibt es eine Möglichkeit, ein Python-Skript von einer Shell aus auszuführen, ohne den vollständigen Pfad zu schreiben?So führen Sie ein Python-Skript ohne Angabe des vollständigen Pfads portabel aus

Zum Beispiel in Linux, würde ich während in meinem Home-Verzeichnis

cd ~ 

der Lage sein, wie ein Python-Skript ausgeführt werden soll run.py genannt, die in Wort ist, ~/long/path/to/run Py, aber ich will, um sie auszuführen, indem sie einfach

python run.py 

statt

python ~/long/path/to/run.py 

ich für eine Art von sich hoffen würde eine Pfadliste, die mehrere Verzeichnisse enthält, genau wie die PATH-Variable, so dass python run.py die erste run.py ausführt, die sie in einem der Verzeichnisse findet.

Ich habe überlegt, run.py in eine ausführbare Datei umzuwandeln und ihr Verzeichnis die System-PATH-Variable hinzuzufügen, konnte aber keine portable Möglichkeit finden, ein Python-Skript ausführbar zu machen.

EDIT

Ein Jahr später, nachdem sie zu fragen, ich ein bisschen weniger Noob bin, und ich sehe, dass meine Frage nicht ganz klar war und nicht viel Sinn machen, so dass nach einer Frage upvote ich werde einige Dinge klären.

1) Tragbar.

Als ich das fragte, sagte ich tragbar. Wie auch immer, tragbare Geräte sind in diesem Fall nicht klar, und ich habe nicht viel Wert darauf gelegt.

  • den Plattformen: auf POSIX (Linux, MacOS, etc.) und Windows

  • dies noch machen nicht viel Sinn arbeiten sollte, da Windows cmd.exe verwendet und POSIX sh verwendet, so dass jeder könnte man Führen Sie die Befehle mit einer anderen Syntax aus. Nehmen wir an, dass die tragbarste Sache darin besteht, die gleiche Eingabe sowohl sh als auch cmd.exe zu geben, wobei das Python-Skript in beiden Fällen ausgeführt wird. In diesem Fall könnten Sie denselben Befehl von einer ANSI C system-Funktion ausführen, die sh unter POSIX und cmd unter Windows verwendet. ANSI C ist eines der wenigen Dinge, die Windows und POSIX gemeinsam haben, die Frage ist in diesem Fall sinnvoll.

2) Executable

Als nächstes wird der Begriff turning run.py into an executable, ist nicht ganz klar. Damit habe ich über die Linux-Strategie von chmod +x run.py gesprochen, füge einen Shebang #!/usr/bin/env python hinzu und füge sein Verzeichnis dem System hinzu ~/long/path/zur PATH-Umgebungsvariable. Aber das funktioniert nicht für Windows, da Windows keine ausführbare Datei-Metadaten-Eigenschaft wie Linux unterstützt und weil/usr/bin/env nicht unbedingt in Windows existiert.

3) Verlängerung

schließlich in meinem Kopf Ich habe gehofft, eine Lösung, die nicht angibt, welche Art von Datei ausgeführt wird, so dass, wenn wir einen Tag entscheiden, es zu machen, sagt sie, eine Perl-Datei, keine Schnittstellen würden sich ändern.

Daher wäre Schreiben run.py schlecht, weil es den Dateityp angeben würde; es wäre besser in der Lage sein, nur run

Antwort

14

Wenn das Verzeichnis mit run.py auf dem Modul-Suchpfad ist (zum Beispiel PYTHONPATH Umgebungsvariable), sollten Sie in der Lage sein, es wie folgt auszuführen:

python -m run 

Hier ist die Dokumentation auf der -m Kommandozeile Option:

-mmodule-name
Suchen sys.path für das benannte Modul und führt die entsprechende .py Datei als Skript aus.

+0

Danke FJ, das ist genau was ich gesucht habe, ich fühle es hat zwei Vorteile gegenüber dem "#!" Ansatz: 2 –

+0

(spezifisch Entschuldigung, halbfertiger Kommentar) ... Danke F.J, das ist, was ich gesucht habe, ich habe das Gefühl, dass es zwei Vorteile gegenüber dem "#!" Ansatz: 1) nicht überlisten Skripte 2) nicht die globale PATH-Variable und die Verwendung der spezifischeren PYTHONPATH statt. Der Nachteil ist natürlich, dass man immer "python -m" eingeben muss, was viel Platz in Anspruch nimmt, und schlimmer noch, es könnte Code umschreiben, wenn man sich eines Tages entschließt, seine Python-Skripte in Bash-Skripte umzuwandeln. –

+0

Ich versuchte python -m laufen, aber es hat nicht funktioniert ... Ich bin sicher, dass run.py in der PYTHONPATH ist, da ich es importieren kann und es zeigt, wenn ich sys importieren; sys.path drucken ... fehle ich etwas? –

4

Sie ein Python-Skript ausführbar

Hinzufügen machen können, schreiben
#!/usr/bin/env python 

an den Anfang der Datei und macht es ausführbar mit chmod +x.

+0

Danke Alberge, ich war mir nicht sicher, dass dies auf Windows funktioniert, aber es scheint, dass #!/Usr/bin/env python als Kommentar behandelt wird und die Python-Installation automatisch laufende .py-Dateien mit dem Python-Interpreter assoziiert. Das ist besonders gut, wenn Sie .py in Ihren EXTPATH ​​einfügen, so dass Sie Python-Dateien einfach durch Eingabe von "run" anstatt von "run.py" ausführen können, was bedeutet, dass, wenn Sie sich entschließen, Ihre Python-Skripte in say, Perl, umzuwandeln. Sie müssen die Skriptaufrufe nicht neu schreiben. Es wäre toll, wenn es eine einfache Möglichkeit gäbe, Skripte unter Linux zu starten, ohne die Erweiterung zu schreiben und # hinzuzufügen! ... –

+0

Das funktioniert prima mit virtualenv – Henrik

0
  1. Make Python Datei ausführbar (als "Alberge" oben)
  2. ein Verzeichnis erstellen und setzen Sie dieses Verzeichnis in Ihrer PATH-Variable
  3. In diesem Verzeichnis erstellen Links zu Ihrer Python-Skripte
1

Antwort nach der Klärung bearbeiten

ich ziehe die folgende Ansatz zu dem von @ F.J vorgeschlagen. weil Benutzer nicht den Dateityp angeben müssen. Bitte beachten Sie, dass dies in der ursprünglichen Frage nicht angegeben war, sodass seine Antwort auf die ursprüngliche Frage korrekt war.

Rufen Sie die Datei pytest.py auf, um Konflikte mit einem möglicherweise vorhandenen Programm run zu vermeiden.

Auf POSIX (MacOS, Linux) tun, was @Petr sagte, die auf basiert, was @alberge sagte:

  • chmod +x
  • hinzufügen shebang #!/usr/bin/env python
  • ein Verzeichnis erstellen und auf Pfad hinzufügen . Übliche Stellen auf Linux sind: ~/bin/für einen einzelnen Benutzer, /usr/local/bin/ für alle Benutzer
  • Symlink (cp -s) die Datei unter PATH mit Basisnamen pytest statt pytest.py

an Fenstern:

  • Erstellen Sie ein Verzeichnis und fügen Sie es zu PATH hinzu. AFAIK, es gibt keinen herkömmlichen Ort dafür, also warum nicht C:\bin\ und ~\bin\?
  • hinzufügen .PY zum PATHEXT Umgebungsvariable, so dass Windows-Dateien mit Python-Erweiterung als runnable Dateien erkennt man, ohne dass die Erweiterung
  • Associate Python-Dateien mit dem python.exe Interpreter (Windows Explorer> rechts eingeben klicken> auf „Verwenden Sie immer das ausgewählte Programm "). Es gibt eine Option für das Python-Installationsprogramm, das dies für Sie erledigt.
  • Symlink pytestmit Erweiterung in das Verzeichnis unter PATH (mit Link-Shell-Erweiterung von Windows Explorer oder mklink name dest von cmd)

Jetzt system("pytest"); sollte in beiden Systemen arbeiten (sh unter Linux, cmd unter Windows)

Verwandte Themen