web-dev-qa-db-fra.com

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

Je ne parviens pas à faire passer les arguments de ligne de commande aux programmes Python si je tente 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écuter:

>test foo
Args: []

comparé à:

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

Je pense avoir résolu ça. Pour une raison quelconque, il existe un SECOND endroit dans le registre (outre celui indiqué 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).

91
mckoss

Mon paramètre était encore sous une autre clé de registre, HKEY_CLASSES_ROOT\py_auto_file. Les autres clés mentionnées existaient également, mais Windows utilisait celle-ci pour une raison quelconque.

13
bainorama

Pour Python 3.3 sous Windows 7, mon paramètre était défini sur une autre clé de registre. la clé que j'ai changé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 n'y ai ajouté que %*. 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 modifiée qui a permis de le faire fonctionner.

8
Cody Piersall

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

Pour que cela fonctionne pour moi, je devais utiliser le chemin du registre:

HKEY_CLASSES_ROOT\py_auto_file\Shell\open\command

et ajouté un %*

2
rundekugel

Intéressant. Fonctionne ici avec 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
1
hughdbrown

Les associations de votre programme pour les fichiers .py peuvent être gâchées. Réassociez simplement les fichiers .py avec votre exécutable python.

Faites un clic droit sur un fichier .py> Open with> Choose default program ...> [find C:\PythonXY\python.exe]

0
congusbongus

En regardant à travers le registre Windows, j'ai trouvé tous les endroits où quelque chose comme 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" %*.

0
Richard Mateosian

J'ai vérifié toutes les clés de registre avec python.exe et py_auto_file et je les ai fait pointer vers mon installation actuelle en python, y compris le %* à 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. Je devais aussi changer mon application python par défaut.

 Application dialog

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 d'entre eux comme application par défaut pour Python. Finalement, j'ai pu obtenir mes arguments de script avec l'un de ces trois.

0
MrLeeh

Si cela est corrigé 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" %*
0
stuw