Wie führe ich Python-Skripte in Windows aus?

91

Ich habe ein einfaches Skript blah.py (mit Python 2):

import sys
print sys.argv[1]

Wenn ich mein Skript ausführe durch:

python c:/..../blah.py argument

Es gibt ein Argument aus, aber wenn ich ein Skript ausführe von:

blah.py argument

Fehler tritt auf:

IndexError ...

Argumente werden also nicht an das Skript übergeben.

python.exe in PATH. Ordner mit blah.py auch in PATH.
python.exe ist das Standardprogramm zum Ausführen von * .py-Dateien.

Was ist das Problem?

ton4eg
quelle
3
Das Posten eines Codeausschnitts kann uns dabei helfen.
Jldupont
Mann ohne Kristallkugel hat bereits eine Lösung gegeben =) print sys.argv [1] erzeugt diesen Fehler.
ton4eg
Wenn Sie mehrere Versionen von Python installiert haben, benötigen Sie möglicherweise diesen stackoverflow.com/questions/1934675/… .
Laike9m
Weisen Sie Python manuell an, mein Skript über die Registrierung auszuführen: "C: \ Python27 \ python.exe" "C: \ Python27 \ tpt.py" "% 1" `

Antworten:

144

Wenn Sie ein Skript ausführen, ohne vorher "Python" einzugeben, müssen Sie zwei Dinge darüber wissen, wie Windows das Programm aufruft. Zunächst müssen Sie herausfinden, um welche Art von Datei es sich bei Windows handelt:

    C: \> assoc .py
    .py = Python.File

Als nächstes müssen Sie wissen, wie Windows Dinge mit dieser Erweiterung ausführt. Es ist dem Dateityp "Python.File" zugeordnet, daher zeigt dieser Befehl, was er tun wird:

    C: \> ftype Python.File
    Python.File = "c: \ python26 \ python.exe" "% 1"% *

Wenn ich also auf meinem Computer "blah.py foo" eingebe, wird genau dieser Befehl ausgeführt, ohne dass sich die Ergebnisse unterscheiden, als wenn ich das Ganze selbst eingegeben hätte:

    "c: \ python26 \ python.exe" "blah.py" foo

Wenn Sie dasselbe eingeben, einschließlich der Anführungszeichen, erhalten Sie identische Ergebnisse wie bei der Eingabe von "blah.py foo". Jetzt sind Sie in der Lage, den Rest Ihres Problems selbst herauszufinden.

(Oder veröffentlichen Sie weitere hilfreiche Informationen in Ihrer Frage, z. B. das tatsächliche Ausschneiden und Einfügen von Kopien dessen, was Sie in der Konsole sehen. Beachten Sie, dass Personen, die solche Dinge tun, ihre Fragen zur Abstimmung stellen und Reputationspunkte erhalten, sowie mehr Personen werden ihnen wahrscheinlich mit guten Antworten helfen.)

Eingebracht von Kommentaren:

Selbst wenn assoc und ftype die richtigen Informationen anzeigen, kann es vorkommen, dass die Argumente entfernt werden. In diesem Fall kann es hilfreich sein, die relevanten Registrierungsschlüssel für Python direkt zu reparieren. Stellen Sie die

HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\command

Schlüssel zu:

"C:\Python26\python26.exe" "%1" %*

Vermutlich %*fehlte zuvor. Ebenso einstellen

 HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

auf den gleichen Wert. Siehe http://eli.thegreenplace.net/2010/12/14/problem-passing-arguments-to-python-scripts-on-windows/

Beispiel für eine Registrierungseinstellung für python.exe HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\commandDer Registry - Pfad kann variieren, Verwendung python26.exeoder python.exeoder je nachdem , was bereits in der Registrierung.

Geben Sie hier die Bildbeschreibung ein HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

Peter Hansen
quelle
30
Selbst wenn assocund ftypedie richtigen Informationen angezeigt werden, kann es vorkommen, dass die Argumente entfernt werden. In diesem Fall kann es hilfreich sein, die relevanten Registrierungsschlüssel für Python direkt zu reparieren. Setzen Sie den HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\commandSchlüssel auf: "C:\Python26\python26.exe" "%1" %* Wahrscheinlich %*fehlte zuvor. Stellen Sie HKEY_CLASSES_ROOT\py_auto_file\shell\open\commandden gleichen Wert ein. Siehe eli.thegreenplace.net/2010/12/14/…
Parvus
5
@parvus Dein Kommentar war die ultimative Lösung für mich. Selbst wenn die Assoziationen korrekt gelesen wurden, wurden diese beiden Tasten falsch eingestellt.
Nathan Cox
1
Ich habe auch Probleme mit HKEY_CLASSES_ROOT \ .py \ OpenWithProgids, die auf etwas VisualStudio-bezogenes festgelegt sind, insbesondere wenn ich versuche, Python-Skripte in meinen AppVeyor-Tests auszuführen. Siehe help.appveyor.com/discussions/problems/… .
Jack O'Connor
1
Ich habe ein ähnliches Problem. Anaconda hat standardmäßig einen Registrierungsschlüssel mit fehlendem% * hinzugefügt
prasad
In Win10 schreibe test.py 123ich und werde 123gedruckt als sys.argv[1]. Hat Microsoft etwas geändert?
Hrvoje T
22

Sie sollten festlegen, dass die Standardanwendung für die Verarbeitung von Python-Dateien python.exe ist.

Klicken Sie mit der rechten Maustaste auf eine * .py-Datei und wählen Sie das Dialogfeld "Öffnen mit". Wählen Sie dort "python.exe" und aktivieren Sie "Dieses Programm immer für diesen Dateityp verwenden" (so ähnlich).

Dann werden Ihre Python-Dateien immer mit python.exe ausgeführt

Santosc
quelle
16

Wenn Sie Ihre Python-Skripte ausführen möchten, ohne das .py(oder .pyw) am Ende des Dateinamens einzugeben , müssen Sie der Liste der Erweiterungen in der Umgebungsvariablen PATHEXT .PY(oder .PY;.PYW) hinzufügen .

In Windows 7:

Rechtsklick auf Computer
Linksklick Eigenschaften
Erweiterte Systemeinstellungen-Linksklick auf
die Registerkarte Erweitert-Linksklick auf
Umgebungsvariablen-links klicken ...
unter „Systemvariablen“ nach unten scrollen , bis Sie sehen PATHEXT
Linksklick auf PATHEXT markieren es
links- Klicken Sie auf Bearbeiten ...
Bearbeiten Sie "Variablenwert" so, dass er enthält ;.PY (die End-Taste springt zum Ende).
Klicken Sie mit der
linken Maustaste auf OK.
Klicken Sie mit der linken Maustaste auf OK. Klicken Sie mit der linken Maustaste auf OK

Hinweis 1: In Eingabeaufforderungsfenstern wird die Änderung nicht angezeigt, ohne dass sie geschlossen und erneut geöffnet wird.

Hinweis Nr. 2: Der Unterschied zwischen den Erweiterungen .pyund .pywbesteht darin, dass die erstere beim Ausführen eine Eingabeaufforderung öffnet und die letztere nicht.

Auf meinem Computer habe ich ;.PY;.PYWals letzte Erweiterung (niedrigste Priorität) hinzugefügt , sodass die Werte "vor" und "nach" von PATHEXT wie folgt lauten:

Vor: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

nach dem .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

Hier sind einige lehrreiche Befehle:

C:\>echo %pathext%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

C:\>assoc .py
.py=Python.File

C:\>ftype Python.File
Python.File="C:\Python32\python.exe" "%1" %*

C:\>assoc .pyw
.pyw=Python.NoConFile

C:\>ftype Python.NoConFile
Python.NoConFile="C:\Python32\pythonw.exe" "%1" %*

C:\>type c:\windows\helloworld.py
print("Hello, world!")  # always use a comma for direct address

C:\>helloworld
Hello, world!

C:\>
Dave Burton
quelle
4

Wie führe ich Python-Skripte in Windows aus?

Sie könnten Pylauncher installieren . Es wird zum Starten von .py-, .pyw-, .pyc- und .pyo-Dateien verwendet und unterstützt mehrere Python-Installationen:

T\:> blah.py argument

Sie können Ihr Python-Skript ausführen, ohne die Erweiterung .py anzugeben, wenn Sie in der Umgebungsvariablen PATHEXT .py, .pyw haben:

T:\> blah argument

Es bietet Unterstützung für shebang ( #!Kopfzeile), um die gewünschte Python-Version unter Windows auszuwählen, wenn Sie mehrere Versionen installiert haben. Sie können eine * nix-kompatible Syntax verwenden #! /usr/bin/env python.

Sie können die Version explizit angeben, z. B. um sie mit der neuesten installierten Python 3-Version auszuführen:

T:\> py -3 blah.py argument

Es sollte auch Ihr sys.argvProblem als Nebeneffekt beheben .

jfs
quelle
Python Launcher befindet sich im Beta-Status.
Nicolas Barbulesco
@NicolasBarbulesco: Python Launcher ist in Python 3.3 enthalten, dh es ist gut genug
jfs
Vielleicht. Es gelang mir jedoch nicht, Python 3 unter Windows zu installieren . Vielleicht kannst du mir hier helfen.
Nicolas Barbulesco
4

Ich bin auf dasselbe Problem gestoßen, aber im Zusammenhang mit der Notwendigkeit, meinen Code für Windows-Benutzer (von Linux) zu packen. Mein Paket enthält eine Reihe von Skripten mit Befehlszeilenoptionen.

Ich benötige diese Skripte, um an der entsprechenden Stelle auf den Computern der Windows-Benutzer installiert zu werden, damit sie sie über die Befehlszeile aufrufen können. Da das Paket angeblich benutzerfreundlich ist, ist es unmöglich, meine Benutzer zu bitten, ihre Registrierung zu ändern, um diese Skripte auszuführen.

Ich bin auf eine Lösung gestoßen, die die Mitarbeiter von Continuum für Python-Skripte verwenden, die mit ihrem Anaconda-Paket geliefert werden. Beispiele finden Sie in Ihrem Anaconda / Scripts-Verzeichnis.

testErstellen Sie für ein Python-Skript zwei Dateien: a test.batund a test-script.py.

test.batsieht wie folgt aus (die aufgerufenen .batDateien mit einem relativen Pfad, den ich für meine Zwecke angepasst habe):Anaconda\Scriptspython.exe

@echo off
set PYFILE=%~f0
set PYFILE=%PYFILE:~0,-4%-script.py
"python.exe" "%PYFILE%" %*

test-script.py ist dein eigentliches Python-Skript:

import sys
print sys.argv

Wenn Sie diese beiden Dateien in Ihrem lokalen Verzeichnis belassen, können Sie Ihr Python-Skript über die .batDatei aufrufen

test.bat hello world
['C:\\...\\test-scripy.py', 'hello', 'world']

Wenn Sie beide Dateien an einen Speicherort kopieren, der sich auf Ihrem PATH(z. B. Anaconda\Scripts) befindet, können Sie Ihr Skript sogar aufrufen, indem Sie das .batSuffix weglassen

test hello world
['C:\\...Anaconda\\Scripts\\test-scripy.py', 'hello', 'world']

Haftungsausschluss: Ich habe keine Ahnung, was los ist und wie dies funktioniert, und würde mich über jede Erklärung freuen.


quelle
Das Erstellen eines .batWrappers für jedes Python-Skript ist umständlich und redundant. Ich würde das nicht empfehlen.
Tripleee
2

Auf Windows - ,

Um ein Python-Modul auszuführen, ohne "python" einzugeben ,

-> Klicken Sie mit der rechten Maustaste auf eine Python-Datei (*. Py)

-> Setzen Sie die Eigenschaft open with auf "python.exe".

-> Aktivieren Sie das Kontrollkästchen "Dieses Programm immer für diesen Dateityp verwenden".

-> Hängen Sie den Pfad von python.exe an die Umgebungsvariable an, z. B. C: \ Python27 an die Umgebungsvariable PATH.

So führen Sie ein Python-Modul aus, ohne die Erweiterung ".py" einzugeben

-> Bearbeiten Sie die PATHEXT-Systemvariable und fügen Sie der Liste die Erweiterung ".PY" hinzu.

Aspak Rogatiya
quelle
1

Gefunden eine unglaublich nützliche Antwort hier : Wie andere Python - Versionen in cmd laufen zu lassen?

Ich würde vorschlagen, das vor einiger Zeit in Python 3.3 eingeführte Dienstprogramm Python Launcher für Windows zu verwenden. Sie können es auch manuell herunterladen und direkt von der Website des Autors installieren, um es mit früheren Versionen von Python 2 und 3 zu verwenden.

Unabhängig davon, wie Sie es erhalten, hat es sich nach der Installation mit allen Standard-Python-Dateierweiterungen (z. B. .py-, .pyw-, .pyc- und .pyo-Dateien) verknüpft. Sie können nicht nur explizit steuern, welche Version an der Eingabeaufforderung verwendet wird, sondern auch Skript für Skript, indem Sie Linux / Unix-y shebang #! / Usr / bin / env pythonX-Kommentare an der hinzufügen Beginn Ihrer Python-Skripte.

Wie JF Sebastian vorschlägt, ist Python Launcher für Windows die beste und Standardoption zum Starten verschiedener Python-Versionen unter Windows. Früher war es ein Tool von Drittanbietern, jetzt wird es seit Python 3.3 offiziell unterstützt.

Neu in Version 3.3.

Der Python Launcher für Windows ist ein Dienstprogramm, das das Auffinden und Ausführen verschiedener Python-Versionen unterstützt. Es ermöglicht Skripten (oder der Befehlszeile), eine Präferenz für eine bestimmte Python-Version anzugeben, und findet diese Version und führt sie aus.

Dies ist ein großartiges Tool, benutze es einfach!

laike9m
quelle
0

Können Sie python.exe von jeder Karte aus ausführen? Wenn Sie dies nicht tun, prüfen Sie, ob Sie die richtigen Werte für python.exe in der PATH-Umgebung haben

Befinden Sie sich im selben Verzeichnis wie blah.py. Überprüfen Sie dies, indem Sie den Befehl -> edit blah.py eingeben und prüfen, ob Sie diese Datei öffnen können

BEARBEITEN:

In diesem Fall können Sie nicht. ( python arg bedeutet, dass Sie python.exe mit einigen Parametern aufrufen, von denen Python annimmt, dass es sich um den Dateinamen des Skripts handelt, das Sie ausführen möchten.)

Sie können Bat-Dateien mit Linien in Ihrer Pfadzuordnung erstellen und die .bat-Datei ausführen

Beispiel:
Erstellen Sie in einer der Pfadzuordnungen die Datei blah.py.bat Edit und setzen Sie eine Zeile

python C:\Somedir\blah.py

Sie können jetzt blah.py von jedem Ort aus ausführen, da Sie beim Ausführen von bat-Dateien keine .bat-Erweiterung setzen müssen

Luka Rahne
quelle
Python in PATH. Und Verzeichnis, das blah.py auch in PATH enthält. Die Hauptidee besteht darin, ein Python-Skript auszuführen, ohne den vollständigen Pfad dazu zu schreiben. Aber jetzt habe ich Probleme mit der Übergabe von Argumenten.
ton4eg
3
Ralu, du brauchst keine Batch-Datei, um ein Python-Skript auf diese Weise auszuführen. Verwenden Sie die PATHEXT-Umgebungsvariable, um .py und .pyw als ausführbare Erweiterungen einzuschließen. Aus diesem Grund müssen Sie auch .bat nicht angeben.
Todd
0

Wenn ich das verstanden habe, ist es so:

C:\Users\(username)\AppData\Local\Programs\Python\Python(version)

KOPIEREN (nicht löschen) python.exe und benennen Sie in py.exe um und führen Sie Folgendes aus:

py filename.py
Lucas Paz
quelle
0

Führen Sie einfach den Befehl aus:

C:>python .\file_name.py

Angenommen, der Dateiname befindet sich im selben Ordner und Python wurde bereits zu Umgebungsvariablen hinzugefügt.

Mwiza
quelle