web-dev-qa-db-de.com

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

Ich habe Probleme, Befehlszeilenargumente an Python-Programme zu übergeben, wenn ich sie direkt als ausführbare Befehle von einer Windows-Befehls-Shell ausführen möchte. Wenn ich zum Beispiel 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" %*
79
mckoss

Ich glaube, ich habe das gelöst. Aus irgendeinem Grund gibt es einen zweiten Platz in der Registrierung (abgesehen von denjenigen, die von den Dateizuordnungen angezeigt werden, die in HKEY_CLASSES_ROOT\Python.File\Shell\open\command gespeichert sind):

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

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

91
mckoss

Meine Einstellung war unter einem weiteren Registrierungsschlüssel HKEY_CLASSES_ROOT\py_auto_file. Die anderen erwähnten Tasten waren auch vorhanden, aber Windows verwendete diese aus irgendeinem Grund.

13
bainorama

Bei Python 3.3 unter Windows 7 befand sich meine Einstellung unter einem anderen Registrierungsschlüssel. Der Schlüssel, den ich geändert habe, um die Argumente übergeben zu lassen, 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 %* angehängt. Der Schlüsselwert lautet 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, der es funktionierte.

8
Cody Piersall

Hier sind .reg-Dateien für Python 3.6, 2.7 und Anaconda3 zu beheben:

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\" %*"
2
iki

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

HKEY_CLASSES_ROOT\py_auto_file\Shell\open\command

und fügte einen %* hinzu

2
rundekugel

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
1
hughdbrown

Ihre Programmzuordnungen für .py-Dateien sind möglicherweise fehlerhaft. Verknüpfen Sie einfach .py-Dateien erneut mit Ihrer ausführbaren Python-Datei.

Klicken Sie mit der rechten Maustaste auf eine .py-Datei> Open with> Choose default program ...> [C:\PythonXY\python.exe suchen].

0
congusbongus

Beim Durchschauen der Windows-Registry habe ich alle Stellen gefunden, an denen etwas wie Python36\pythonw.exe "%1" %* erscheint.

Wenn ich an der Eingabeaufforderung python app.py args eingebe, funktioniert alles einwandfrei.

Wenn ich nur den App-Namen (app.py args) verwende, öffnet Windows app.py in Python, die App schlägt jedoch 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. Ich kann jedoch nicht anhand der Registrierungseinträge herausfinden, wie der Befehl erstellt wird. Es scheint, "%1" anstelle von "%1" %* zu verwenden.

0

Ich habe alle Registrierungsschlüssel mit python.exe und py_auto_file überprüft und sie auf meine aktuelle Python-Installation verweisen lassen, einschließlich th %* am Ende, an dem die Argumente übergeben werden. Sie waren ziemlich viele:

  • HKEY_CLASSES_ROOT\Applications\python.exe\Shell\open\command: 

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

    • 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\command

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

    • 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" "% *"
  • HKEY_CLASSES_ROOT\Applications\pythonw.exe\Shell\open\command

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

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

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

 Application dialog

Wie man sehen kann, habe ich 3 Python-Versionen installiert. Es ist unmöglich zu sehen, welche hier ist, also habe ich alle drei als meine Standard-Python-Anwendung ausprobiert. Letztendlich konnte ich meine Skriptargumente mit einer dieser drei bekommen.

0
MrLeeh

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" %*
0
stuw