Windows ne transmet pas d'arguments de ligne de commande aux programmes Python exécutés à partir du shell

87

J'ai du mal à faire passer des arguments de ligne de commande aux programmes Python si j'essaie de les exécuter directement en tant que commandes exécutables à partir d'un shell de commande Windows. Par exemple, si j'ai ce programme (test.py):

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

Et exécutez:

>test foo
Args: []

par rapport à:

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

Ma configuration a:

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
la source
Cependant, cela fonctionne pour moi. C: \ Documents and Settings \ Quim> test foo Args: ['foo'] J'ai situé test.py à l'emplacement initial de cmd.exe (% HOMEDRIVE %% HOMEPATH% dans les propriétés). Pour le reste il n'y a rien de spécial dans ma configuration: winxp, Activepython 2.6.5
joaquin
Pourriez-vous s'il vous plaît utiliser RegScanner et trouver toutes les occurrences de Python.Filedans votre registre?
Piotr Dobrogost
2
Wow quel bogue frustrant: (Je viens de réinstaller Python et il est toujours cassé! Le bogue a été signalé sur le suivi des problèmes Python il y a deux ans bugs.python.org/issue7936 mais il n'y a pas de correctif - peu de développeurs utilisent Windows.
Colonel Panic
2
Je suis tombé dessus quand j'ai installé python 3.4 et essayé d'utiliser python 2.7. On dirait que le programme d'installation de python 3.4 l'a gâché?
Dogmatixed
Si le système utilise [HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exeou [HKCU|HKLM\SOFTWARE\Classes\py_auto_file, il est mal configuré et les clés incriminées doivent être supprimées. Ensuite, utilisez l'Explorateur ("ouvrir avec" ou l'application de paramètres d'association de fichiers) pour sélectionner l'entrée "Python" correcte qui utilise le [HKCU|HKLM]\SOFTWARE\Classes\Python.FileProgId standard . Vérifiez la shell\open\commandsous - clé dans regedit. Si Python 3 est installé, le modèle de commande doit utiliser le lanceur py. Si le lanceur est installé pour tous les utilisateurs, le modèle doit être "C:\Windows\py.exe" "%1" %*.
Eryk Sun

Réponses:

106

Je pense que j'ai résolu ça. Pour une raison quelconque, il y a une SECONDE place dans le registre (en plus de celle indiquée par les associations de fichiers stockées dans HKEY_CLASSES_ROOT \ Python.File \ shell \ open \ command):

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

Cela semble être le paramètre de contrôle sur mon système. Le paramètre de registre ci-dessus ajoute le "% *" pour transmettre tous les arguments à python.exe (il manquait dans mon registre pour une raison quelconque).

mckoss
la source
8
Ma clé se trouve ici sur Windows 7: HKEY_USERS \ S-1-5-21-2829634124-923609355-2255922086-1001 \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command
Steven Keith
4
Avec la valeur: C: \ Python26 \ python.exe% 1% *
Steven Keith
2
A travaillé pour moi, rappelez-vous que la réponse de mckoss est échappée ou un fichier .REG si vous modifiez les valeurs directement supprimées les échappements là
dedans
3
Remarque: la cause première de cela peut être due à une association de fichier initiale avec des fichiers .py avant l'installation de Python. Je viens de rencontrer ce problème, des fichiers de type .py avaient été associés à Notepad, puis Python a été installé et ce problème horrible a soulevé sa vilaine tête. Sur Windows 10 BTW.
g4m3c0d3r
2
Récemment changé le lanceur pour utiliser C: \ Windows \ py.exe et rencontré ce bogue. Cependant, j'ai modifié la clé dans la version de @ StevenKeith, avec "py.exe" remplacé par "python.exe"
Casey Kuball
14

Mon cadre était sous une autre clé de Registre, HKEY_CLASSES_ROOT\py_auto_file. Les autres clés mentionnées existaient également, mais Windows l'utilisait pour une raison quelconque.

bainorama
la source
10

Pour Python 3.3 sur Windows 7, mon paramètre était sous une autre clé de registre; la clé que j'ai modifiée pour faire passer les arguments était

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

C'était "C:\Python\Python33\python.exe" "%1". Je l'ai seulement annexé %*. La valeur de la clé est maintenant "C:\Python\Python33\python.exe" "%1" %*.

J'avais plusieurs (au moins cinq) autres clés avec la valeur "C:\Python\Python33\python.exe" "%1", mais c'est celle que j'ai changée qui l'a fait fonctionner.

Cody Piersall
la source
5

Voici les fichiers .reg à corriger pour Python 3.6, 2.7 et Anaconda3:

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 (changer le nom d'utilisateur)

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
la source
4

Pour que cela fonctionne pour moi, j'ai dû utiliser le chemin du registre:

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

et a ajouté un %*

rundekugel
la source
0

Intéressant. Fonctionne ici en utilisant python 2.6 et 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
la source
0

Les associations de programmes pour les .pyfichiers peuvent être faussées. Réassociez simplement les .pyfichiers à votre exécutable python.

Cliquez droit sur un .pyfichier> Open with> Choose default program ...> [trouver C: \ PythonXY \ python.exe]

congusbongus
la source
Ne fonctionnait pas sur mon système, car il appelait toujours Python 3.6 par défaut. La réponse sélectionnée a fonctionné
Aaron3468
Il y a des problèmes depuis Windows10, donc cela ne fonctionne pas toujours.
rundekugel
0

J'ai vérifié toutes les clés de registre avec python.exeet py_auto_fileet les ai faites pointer vers mon installation python actuelle, y compris %*la fin qui transmet les arguments. Ils étaient nombreux:

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

    • org: "C: \ miniconda3 \ python.exe" "% 1" "% *"
    • modifié: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_CLASSES_ROOT \ py_auto_file \ shell \ open \ command

    • org: "C: \ Program Files \ Sublime Text 3 \ sublime_text.exe" "% 1"
    • modifié: "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"
    • modifié: "C: \ Python35 \ pythonw.exe" "% 1" "% *"
  • HKEY_CURRENT_USER \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command

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

Mais cela n'a pas fait le travail pour moi. J'ai également dû changer mon application python par défaut.

Boîte de dialogue d'application

Comme on peut le voir, j'ai 3 versions de Python installées. Il est impossible de voir lequel est lequel ici, alors j'ai essayé les trois comme application python par défaut. Finalement, j'ai pu obtenir mes arguments de script avec l'un de ces trois.

MrLeeh
la source
0

En parcourant le registre Windows, j'ai trouvé tous les endroits où quelque chose de similaire Python36\pythonw.exe "%1" %*apparaît.

Lorsque je tape python app.py argsà l'invite de commande, tout fonctionne correctement.

Lorsque j'utilise uniquement le nom de l'application ( app.py args), Windows ouvre app.py en Python, mais l'application échoue lorsqu'elle tente d'accéder à argv [1], car len (argv) vaut 1.

Apparemment, Windows en sait assez pour passer un fichier py à Python, mais je ne peux pas comprendre en regardant les entrées de registre comment il construit la commande. Il semble utiliser "%1"plutôt que "%1" %*.

Richard Mateosian
la source
0

Si corrigé cela sur mon système Windows 10 en modifiant les clés de registre suivantes:

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

à cette valeur:

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

Un grand merci pour la plupart des autres réponses pour m'aider à trouver la solution!

Mon cas était d'ouvrir .py-files avec py.exe(pas python.exedirectement), ce cas, il a été noté dans quelques commentaires, mais j'ai décidé de poster ceci comme une réponse séparée pour souligner la différence.

J'ai donc mes .pyfichiers associés C:\Windows\py.exeet dans la C:\Windows\py.iniconfiguration j'ai quelques définitions de shebang

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

à utiliser dans mes scripts comme celui-ci #!<MY_VENV_PY>.

Et sur Microsoft Windows 7 [Version 6.1.7601] mon script python n'a PAS reçu les arguments comme celui-ci

script.py 1 2

mais cela a bien fonctionné

py script.py 1 2

Les associations de fichiers étaient OK

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

J'ai essayé beaucoup de changements de registre, mais le dernier a aidé était le changement suivant (enregistré dans un .reg-file et exécuté). J'ai trouvé cette "%1"chaîne de recherche de clé de registre avec la valeur initiale "C:\Windows\py.exe" "%1"et ajoutée %*à la fin comme le notent d'autres réponses:

Windows Registry Editor Version 5.00

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

Pour information, avant d'essayer de configurer ces clés et valeurs et je n'ai pas aidé (du moins avant ce qui précède):

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
la source
0

J'ai dû modifier cela dans Windows 10 pour que cela fonctionne (% * à la fin)

Ordinateur \ HKEY_USERS \ S-1-5-21-2364940108-955964078-1358188674-1001 \ Software \ Classes \ Applications \ py.exe \ shell \ open \ command

Arunex
la source