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" %*
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).
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.
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.
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\" %*"
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 %*
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
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]
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" %*
.
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.
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.
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" %*