Windows übergibt keine Befehlszeilenargumente an Python-Programme, die von der Shell ausgeführt werden

87

Ich habe Probleme, Befehlszeilenargumente an Python-Programme zu übergeben, wenn ich versuche, sie direkt als ausführbare Befehle über eine Windows-Befehlsshell auszuführen. Zum Beispiel, wenn ich dieses Programm habe (test.py):

import sys
print "Args: %r" % sys.argv[1:]

Und ausführen:

>test foo
Args: []

verglichen mit:

>python test.py foo
Args: ['foo']

Meine Konfiguration hat:

PATH=...;C:\python25;...
PATHEXT=...;.PY;....

>assoc .py
.py=Python.File

>ftype | grep Python
Python.CompiledFile="C:\Python25\python.exe" "%1" %*
Python.File="C:\Python25\python.exe" "%1" %*
Python.NoConFile="C:\Python25\pythonw.exe" "%1" %*
mckoss
quelle
Es funktioniert jedoch bei mir. C: \ Dokumente und Einstellungen \ Quim> test foo Argumente: ['foo'] Ich habe test.py an der ursprünglichen Position für cmd.exe platziert (% HOMEDRIVE %% HOMEPATH% in Eigenschaften). Im Übrigen gibt es nichts Besonderes in meinem Setup: WinXP, Activepython 2.6.5
Joaquin
Könnten Sie bitte RegScanner verwenden und alle Vorkommen Python.Filein Ihrer Registrierung finden?
Piotr Dobrogost
2
Wow, was für ein frustrierender Fehler :( Ich habe Python gerade neu installiert und es ist immer noch kaputt! Der Fehler wurde vor zwei Jahren im Python-Issue-Tracker gemeldet. Bugs.python.org/issue7936, aber es gibt keine Lösung - nur wenige Entwickler verwenden Windows.
Colonel Panic
2
Ich bin darauf gestoßen, als ich Python 3.4 installiert und versucht habe, Python 2.7 zu verwenden. Sieht aus wie das Python 3.4-Installationsprogramm es vermasselt hat?
Dogmatixed
Wenn das System [HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exeoder verwendet [HKCU|HKLM\SOFTWARE\Classes\py_auto_file, ist es falsch konfiguriert und die fehlerhaften Schlüssel sollten gelöscht werden. Verwenden Sie dann den Explorer ("Öffnen mit" oder die App für Dateizuordnungseinstellungen), um den richtigen "Python" -Eintrag auszuwählen, der die Standard- [HKCU|HKLM]\SOFTWARE\Classes\Python.FileProgId verwendet. Überprüfen Sie den shell\open\commandUnterschlüssel in regedit. Wenn Python 3 installiert ist, sollte die Befehlsvorlage den Py-Launcher verwenden. Wenn der Launcher für alle Benutzer installiert ist, sollte die Vorlage sein "C:\Windows\py.exe" "%1" %*.
Eryk Sun

Antworten:

106

Ich glaube, ich habe das gelöst. Aus irgendeinem Grund gibt es einen ZWEITEN Platz in der Registrierung (außer dem, der durch die in HKEY_CLASSES_ROOT \ Python.File \ shell \ open \ command gespeicherten Dateizuordnungen angezeigt wird):

[HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command]
@="\"C:\\Python25\\python.exe\" \"%1\" %*"

Dies scheint die Steuerungseinstellung auf meinem System zu sein. Die obige Registrierungseinstellung fügt das "% *" hinzu, um alle Argumente an python.exe zu übergeben (es fehlte aus irgendeinem Grund in meiner Registrierung).

mckoss
quelle
8
Mein Schlüssel befindet sich hier unter Windows 7: HKEY_USERS \ S-1-5-21-2829634124-923609355-2255922086-1001 \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command
Steven Keith
4
Mit dem Wert: C: \ Python26 \ python.exe% 1% *
Steven Keith
2
Arbeitete für mich, daran erinnern , dass die Antwort von mckoss ist entkommen oder eine REG - Datei , wenn Sie die Werte bearbeiten direkt die Fluchten dort entfernt
fedmich
3
Nebenbei bemerkt: Die Hauptursache hierfür ist möglicherweise eine anfängliche Dateizuordnung mit .py-Dateien vor der Python-Installation. Gerade auf dieses Problem gestoßen, wurden Dateien vom Typ .py mit Notepad verknüpft und dann wurde Python installiert und dieses hässliche Problem richtete seinen hässlichen Kopf auf. Unter Windows 10 übrigens.
g4m3c0d3r
2
Kürzlich wurde der Launcher so geändert, dass er C: \ Windows \ py.exe verwendet, und dieser Fehler ist aufgetreten. Ich habe jedoch den Schlüssel in der Version von @ StevenKeith geändert, wobei "py.exe" durch "python.exe" ersetzt wurde
Casey Kuball
14

Meine Einstellung befand sich unter einem weiteren Registrierungsschlüssel HKEY_CLASSES_ROOT\py_auto_file. Die anderen genannten Schlüssel waren ebenfalls vorhanden, aber Windows verwendete diesen aus irgendeinem Grund.

Bainorama
quelle
10

Für Python 3.3 unter Windows 7 befand sich meine Einstellung unter einem anderen Registrierungsschlüssel. Der Schlüssel, den ich geändert habe, damit die Argumente übergeben werden, war

HKEY_USERS\S-1-5-21-3922133726-554333396-2662258059-1000_Classes\py_auto_file\shell\open\command

Es war "C:\Python\Python33\python.exe" "%1". Ich habe nur daran angehängt %*. Der Wert des Schlüssels ist jetzt "C:\Python\Python33\python.exe" "%1" %*.

Ich hatte mehrere (mindestens fünf) andere Schlüssel mit dem Wert "C:\Python\Python33\python.exe" "%1", aber dies ist der, den ich geändert habe, damit es funktioniert.

Cody Piersall
quelle
5

Hier sind .reg-Dateien, die für Python 3.6, 2.7 und Anaconda3 repariert werden müssen:

python-3.6.0.reg

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.py]
@="Python.File"
"Content Type"="text/plain"

[HKEY_CLASSES_ROOT\.pyc]
@="Python.CompiledFile"
"Content Type"="text/plain"

[HKEY_CLASSES_ROOT\.pyw]
@="Python.NoConFile"
"Content Type"="text/plain"


[HKEY_CLASSES_ROOT\py_auto_file]

[HKEY_CLASSES_ROOT\py_auto_file\DefaultIcon]
@="C:\\Python36\\DLLs\\py.ico"

[HKEY_CLASSES_ROOT\py_auto_file\shell\open\command]
@="\"C:\\Python36\\python.exe\" \"%1\" %*"


[HKEY_CLASSES_ROOT\Python.File]
@="Python File"

[HKEY_CLASSES_ROOT\Python.File\DefaultIcon]
@="C:\\Python36\\DLLs\\py.ico"

[HKEY_CLASSES_ROOT\Python.File\shell\open\command]
@="\"C:\\Python36\\python.exe\" \"%1\" %*"


[HKEY_CLASSES_ROOT\Python.CompiledFile]
@="Compiled Python File"

[HKEY_CLASSES_ROOT\Python.CompiledFile\DefaultIcon]
@="C:\\Python36\\DLLs\\pyc.ico"

[HKEY_CLASSES_ROOT\Python.CompiledFile\shell\open\command]
@="\"C:\\Python36\\python.exe\" \"%1\" %*"


[HKEY_CLASSES_ROOT\Python.NoConFile]
@="Python File (no console)"

[HKEY_CLASSES_ROOT\Python.NoConFile\DefaultIcon]
@="C:\\Python36\\DLLs\\py.ico"

[HKEY_CLASSES_ROOT\Python.NoConFile\shell\open\command]
@="\"C:\\Python36\\python.exe\" \"%1\" %*"

python-2.7.0.reg

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.py]
@="Python.File"
"Content Type"="text/plain"

[HKEY_CLASSES_ROOT\.pyc]
@="Python.CompiledFile"
"Content Type"="text/plain"

[HKEY_CLASSES_ROOT\.pyw]
@="Python.NoConFile"
"Content Type"="text/plain"


[HKEY_CLASSES_ROOT\py_auto_file]

[HKEY_CLASSES_ROOT\py_auto_file\DefaultIcon]
@="C:\\Python27\\DLLs\\py.ico"

[HKEY_CLASSES_ROOT\py_auto_file\shell\open\command]
@="\"C:\\Python27\\python.exe\" \"%1\" %*"


[HKEY_CLASSES_ROOT\Python.File]
@="Python File"

[HKEY_CLASSES_ROOT\Python.File\DefaultIcon]
@="C:\\Python27\\DLLs\\py.ico"

[HKEY_CLASSES_ROOT\Python.File\shell\open\command]
@="\"C:\\Python27\\python.exe\" \"%1\" %*"


[HKEY_CLASSES_ROOT\Python.CompiledFile]
@="Compiled Python File"

[HKEY_CLASSES_ROOT\Python.CompiledFile\DefaultIcon]
@="C:\\Python27\\DLLs\\pyc.ico"

[HKEY_CLASSES_ROOT\Python.CompiledFile\shell\open\command]
@="\"C:\\Python27\\python.exe\" \"%1\" %*"


[HKEY_CLASSES_ROOT\Python.NoConFile]
@="Python File (no console)"

[HKEY_CLASSES_ROOT\Python.NoConFile\DefaultIcon]
@="C:\\Python27\\DLLs\\py.ico"

[HKEY_CLASSES_ROOT\Python.NoConFile\shell\open\command]
@="\"C:\\Python27\\python.exe\" \"%1\" %*"

ananconda3.reg (Benutzername ändern)

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.py]
@="Python.File"
"Content Type"="text/plain"

[HKEY_CLASSES_ROOT\.pyc]
@="Python.CompiledFile"
"Content Type"="text/plain"

[HKEY_CLASSES_ROOT\.pyw]
@="Python.NoConFile"
"Content Type"="text/plain"


[HKEY_CLASSES_ROOT\py_auto_file]

[HKEY_CLASSES_ROOT\py_auto_file\DefaultIcon]
@="C:\\Users\\username\\Anaconda3\\DLLs\\py.ico"

[HKEY_CLASSES_ROOT\py_auto_file\shell\open\command]
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*"


[HKEY_CLASSES_ROOT\Python.File]
@="Python File"

[HKEY_CLASSES_ROOT\Python.File\DefaultIcon]
@="C:\\Users\\username\\Anaconda3\\DLLs\\py.ico"

[HKEY_CLASSES_ROOT\Python.File\shell\open\command]
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*"


[HKEY_CLASSES_ROOT\Python.CompiledFile]
@="Compiled Python File"

[HKEY_CLASSES_ROOT\Python.CompiledFile\DefaultIcon]
@="C:\\Users\\username\\Anaconda3\\DLLs\\pyc.ico"

[HKEY_CLASSES_ROOT\Python.CompiledFile\shell\open\command]
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*"


[HKEY_CLASSES_ROOT\Python.NoConFile]
@="Python File (no console)"

[HKEY_CLASSES_ROOT\Python.NoConFile\DefaultIcon]
@="C:\\Users\\username\\Anaconda3\\DLLs\\py.ico"

[HKEY_CLASSES_ROOT\Python.NoConFile\shell\open\command]
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*"
iki
quelle
4

Damit es für mich funktioniert, musste ich den Registrierungspfad verwenden:

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

und fügte hinzu a %*

rundekugel
quelle
0

Interessant. Funktioniert hier mit Python 2.6 und Windows XP (5.1.2600):

C:\Documents and Settings\hbrown>python test.py foo
['test.py', 'foo']

C:\Documents and Settings\hbrown>test.py foo
['C:\\Documents and Settings\\hbrown\\test.py', 'foo']

C:\Documents and Settings\hbrown>test foo
['C:\\Documents and Settings\\hbrown\\test.py', 'foo']

C:\Documents and Settings\hbrown>type test.py
import sys
print sys.argv 

C:\Documents and Settings\hbrown>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.PY 

C:\Documents and Settings\hbrown>assoc .py
.py=Python.File
hughdbrown
quelle
0

Ihre Programmzuordnungen für .pyDateien sind möglicherweise durcheinander. Verknüpfen .pySie einfach die Dateien erneut mit Ihrer ausführbaren Python-Datei.

Rechtsklick auf eine .pyDatei> Open with> Choose default program ...> [gefunden C: \ PythonXY \ python.exe]

Congusbongus
quelle
Funktionierte auf meinem System nicht, da standardmäßig Python 3.6 aufgerufen wurde. Die ausgewählte Antwort hat funktioniert
Aaron3468
Seit Windows 10 gibt es Probleme, daher funktioniert dies nicht immer.
Rundekugel
0

Ich habe alle Registrierungsschlüssel mit python.exeund überprüft py_auto_fileund sie auf meine aktuelle Python-Installation verweisen lassen, einschließlich th %*am Ende, das Argumente übergibt. Sie waren ziemlich viele:

  • HKEY_CLASSES_ROOT \ Applications \ python.exe \ shell \ open \ Befehl:

    • org: C: \ miniconda3 \ python.exe% 1% *% *
    • geändert: "C: \ Python35 \ python.exe" "% 1" "% *"
  • Befehl HKEY_CLASSES_ROOT \ py_auto_file \ shell \ open \

    • org: "C: \ Programme \ Sublime Text 3 \ sublime_text.exe" "% 1"
    • geändert: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_CURRENT_USER \ Software \ Classes \ py_auto_file \ shell \ open \ Befehl

    • org: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_USERS \ S-1-5-21-2621213409-1291422344-4183577876-2165 \ Software \ Classes \ py_auto_file \ shell \ open \ Befehl

    • org: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_USERS \ S-1-5-21-2621213409-1291422344-4183577876-2165_Classes \ py_auto_file \ shell \ open \ command

    • org: "C: \ Python35 \ python.exe" "% 1" "% *"
  • Befehl HKEY_CLASSES_ROOT \ Applications \ pythonw.exe \ shell \ open \

    • org: "C: \ Python34 \ pythonw.exe" "% 1"
    • geändert: "C: \ Python35 \ pythonw.exe" "% 1" "% *"
  • HKEY_CURRENT_USER \ Software \ Classes \ Applications \ python.exe \ shell \ open \ Befehl

    • org: "C: \ Python35 \ python.exe" "% 1" "% *"

Aber das hat mir nicht geholfen. Ich musste auch meine Standard-Python-Anwendung ändern.

Anwendungsdialog

Wie man sieht, habe ich 3 Python-Versionen installiert. Es ist unmöglich zu sehen, welches hier welches ist, also habe ich alle drei als meine Standard-Python-Anwendung ausprobiert. Schließlich konnte ich meine Skriptargumente mit einem dieser drei erhalten.

MrLeeh
quelle
0

Beim Durchsuchen der Windows-Registrierung habe ich alle Stellen gefunden, an denen etwas Ähnliches Python36\pythonw.exe "%1" %*angezeigt wird.

Wenn ich python app.py argsan der Eingabeaufforderung tippe, funktioniert alles ordnungsgemäß.

Wenn ich nur den App-Namen ( app.py args) verwende, öffnet Windows app.py in Python, aber die App schlägt fehl, wenn sie versucht, auf argv [1] zuzugreifen, da len (argv) 1 ist.

Anscheinend weiß Windows genug, um eine py-Datei an Python zu übergeben, aber ich kann anhand der Registrierungseinträge nicht herausfinden, wie der Befehl erstellt wird. Es scheint "%1"eher zu verwenden als "%1" %*.

Richard Mateosian
quelle
0

Wenn dies auf meinem Windows 10-System durch Bearbeiten der folgenden Registrierungsschlüssel behoben wurde:

Computer\HKEY_CLASSES_ROOT\py_auto_file\shell\open\command
Computer\HKEY_CLASSES_ROOT\Python.File\Shell\Open\Command
Computer\HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command

auf diesen Wert:

"C:\Python27\python.exe" "%1" %*
stuw
quelle
0

Vielen Dank für die meisten anderen Antworten, die mir geholfen haben, die Lösung zu finden!

Mein Fall war das Öffnen von .pyDateien mit py.exe(nicht python.exedirekt), dieser Fall wurde in einigen Kommentaren vermerkt, aber ich habe beschlossen, dies als separate Antwort zu veröffentlichen, um den Unterschied hervorzuheben.

Also habe ich meine .py-Dateien mit C:\Windows\py.exeund in der C:\Windows\py.iniKonfiguration habe ich ein paar Shebang-Definitionen

[commands]
<my_venv_py> = C:\Programs\my_venv_py\Scripts\python.exe
<my_venv_py_w> = C:\Programs\my_venv_py\Scripts\pythonw.exe

in meinen Skripten so zu verwenden #!<MY_VENV_PY>.

Und unter Microsoft Windows 7 [Version 6.1.7601] hat mein Python-Skript die folgenden Argumente NICHT erhalten

script.py 1 2

aber das hat gut funktioniert

py script.py 1 2

Dateizuordnungen waren in Ordnung

> assoc .py
.py=Python.File

> ftype | grep Python
File STDIN:
Python.CompiledFile="C:\Windows\py.exe" "%1" %*
Python.File=C:\Windows\py.exe "%L" %*
Python.NoConFile="C:\Windows\pyw.exe" "%1" %*

Ich habe viele Registrierungsänderungen versucht, aber die letzte Hilfe war die folgende Änderung (in einer .reg-Datei gespeichert und ausgeführt). Ich habe diese Registrierungsschlüssel-Suchzeichenfolge "%1"mit dem Anfangswert gefunden "C:\Windows\py.exe" "%1"und %*am Ende als Antwort hinzugefügt . Hinweis:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Applications\py.exe\shell\open\command]
@="\"C:\\Windows\\py.exe\" \"%1\" %*"

Zur Information, bevor ich versuchte, diese Schlüssel und Werte einzurichten und nicht half (zumindest vor den oben genannten):

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.py]
@="Python.File"
[HKEY_CURRENT_USER\Software\Classes\.py]
@="Python.File"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.py]
@="Python.File"
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py]
@="Python.File"

[HKEY_CLASSES_ROOT\py_auto_file]
@="Python File"
[HKEY_CLASSES_ROOT\py_auto_file\shell\open\command]
@="\"C:\\Windows\\py.exe\" \"%1\" %*"

[HKEY_CLASSES_ROOT\Python.File]
@="Python File"
[HKEY_CLASSES_ROOT\Python.File\Shell\Open\command]
@="\"C:\\Windows\\py.exe\" \"%1\" %*"
and1er
quelle