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" %*
Python.File
dans votre registre?[HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exe
ou[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.File
ProgId standard . Vérifiez lashell\open\command
sous - 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" %*
.Réponses:
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).
la source
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.la source
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.la source
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\" %*"
la source
Pour que cela fonctionne pour moi, j'ai dû utiliser le chemin du registre:
et a ajouté un
%*
la source
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
la source
Les associations de programmes pour les
.py
fichiers peuvent être faussées. Réassociez simplement les.py
fichiers à votre exécutable python.Cliquez droit sur un
.py
fichier>Open with
>Choose default program ...
> [trouver C: \ PythonXY \ python.exe]la source
J'ai vérifié toutes les clés de registre avec
python.exe
etpy_auto_file
et les ai faites pointer vers mon installation python actuelle, y compris%*
la fin qui transmet les arguments. Ils étaient nombreux:Mais cela n'a pas fait le travail pour moi. J'ai également dû 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 comme application python par défaut. Finalement, j'ai pu obtenir mes arguments de script avec l'un de ces trois.
la source
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" %*
.la source
Si corrigé cela sur mon système Windows 10 en modifiant les clés de registre suivantes:
à cette valeur:
"C:\Python27\python.exe" "%1" %*
la source
Un grand merci pour la plupart des autres réponses pour m'aider à trouver la solution!
Mon cas était d'ouvrir
.py
-files avecpy.exe
(paspython.exe
directement), 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
.py
fichiers associésC:\Windows\py.exe
et dans laC:\Windows\py.ini
configuration j'ai quelques définitions de shebangà 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\" %*"
la source
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
la source