Tengo problemas para que los argumentos de la línea de comandos se pasen a los programas de Python si intento ejecutarlos directamente como comandos ejecutables desde un shell de comandos de Windows. Por ejemplo, si tengo este programa (test.py):
import sys
print "Args: %r" % sys.argv[1:]
Y ejecutar:
>test foo
Args: []
en comparación con:
>python test.py foo
Args: ['foo']
Mi configuración tiene:
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
en su registro?[HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exe
o[HKCU|HKLM\SOFTWARE\Classes\py_auto_file
, entonces está mal configurado y las claves ofensivas deben eliminarse. Luego use Explorer ("abrir con" o la aplicación de configuración de asociación de archivos) para seleccionar la entrada correcta de "Python" que usa el[HKCU|HKLM]\SOFTWARE\Classes\Python.File
ProgId estándar . Verifique lashell\open\command
subclave en regedit. Si Python 3 está instalado, la plantilla de comando debe usar el lanzador py. Si el lanzador está instalado para todos los usuarios, la plantilla debería ser"C:\Windows\py.exe" "%1" %*
.Respuestas:
Creo que resolví esto. Por alguna razón, hay un SEGUNDO lugar en el registro (además del que muestran las asociaciones de archivos almacenadas en HKEY_CLASSES_ROOT \ Python.File \ shell \ open \ command):
[HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command] @="\"C:\\Python25\\python.exe\" \"%1\" %*"
Esta parece ser la configuración de control de mi sistema. La configuración de registro anterior agrega el "% *" para pasar todos los argumentos a python.exe (faltaba en mi registro por alguna razón).
fuente
Mi entorno estaba bajo otra clave de registro,
HKEY_CLASSES_ROOT\py_auto_file
. Las otras claves mencionadas también existían, pero Windows estaba usando esta por alguna razón.fuente
Para Python 3.3 en Windows 7, mi configuración estaba bajo otra clave de registro; la clave que cambié para que se pasaran los argumentos fue
HKEY_USERS\S-1-5-21-3922133726-554333396-2662258059-1000_Classes\py_auto_file\shell\open\command
Lo fue
"C:\Python\Python33\python.exe" "%1"
. Solo le agregué%*
. El valor de la clave es ahora"C:\Python\Python33\python.exe" "%1" %*
.Tenía varias (al menos cinco) otras claves con el valor
"C:\Python\Python33\python.exe" "%1"
, pero esta es la que cambié y la hizo funcionar.fuente
Aquí hay archivos .reg para corregir para Python 3.6, 2.7 y 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 (cambiar nombre de usuario)
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\" %*"
fuente
Para que funcione para mí, tuve que usar la ruta del registro:
y agregó un
%*
fuente
Interesante. Funciona aquí con python 2.6 y 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
fuente
Es posible que sus asociaciones de programas para
.py
archivos estén dañadas. Simplemente vuelva a asociar los.py
archivos con su ejecutable de Python.Haga clic derecho en un
.py
archivo>Open with
>Choose default program ...
> [encontrar C: \ PythonXY \ python.exe]fuente
Verifiqué todas las claves de registro con
python.exe
y laspy_auto_file
hice apuntar a mi instalación actual de Python, incluido%*
el final que pasa argumentos. Fueron bastantes:Pero eso no funcionó para mí. También tuve que cambiar mi aplicación de Python predeterminada.
Como se puede ver, tengo instaladas 3 versiones de Python. Es imposible ver cuál es cuál aquí, así que probé los tres como mi aplicación de Python predeterminada. Eventualmente pude obtener mis argumentos de guión con uno de estos tres.
fuente
Al buscar en el registro de Windows, encontré todos los lugares donde
Python36\pythonw.exe "%1" %*
aparece algo similar .Cuando escribo
python app.py args
en el símbolo del sistema, todo funciona correctamente.Cuando uso solo el nombre de la aplicación (
app.py args
), Windows abre app.py en Python, pero la aplicación falla cuando intenta acceder a argv [1], porque len (argv) es 1.Aparentemente, Windows sabe lo suficiente como para pasar un archivo py a Python, pero no puedo averiguar cómo construye el comando mirando las entradas del registro. Parece estar usando en
"%1"
lugar de"%1" %*
.fuente
Si soluciono esto en mi sistema Windows 10 editando las siguientes claves de registro:
a este valor:
"C:\Python27\python.exe" "%1" %*
fuente
¡Muchas gracias por la mayoría de las otras respuestas por ayudarme a encontrar la solución!
Mi caso fue abrir
.py
archivos conpy.exe
(nopython.exe
directamente), este caso se señaló en un par de comentarios, pero decidí publicar esto como una respuesta separada para enfatizar la diferencia.Entonces tengo mis
.py
archivos asociadosC:\Windows\py.exe
y en laC:\Windows\py.ini
configuración tengo un par de definiciones de shebangpara usar en mis scripts como este
#!<MY_VENV_PY>
.Y en Microsoft Windows 7 [Versión 6.1.7601] mi script de Python NO recibió los argumentos como este
script.py 1 2
pero esto funcionó bien
py script.py 1 2
Las asociaciones de archivos estaban bien
> 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" %*
He intentado muchos cambios en el registro, pero el último que me ayudó fue el siguiente cambio (guardado en un
.reg
archivo y ejecutado). Encontré esta"%1"
cadena de búsqueda de clave de registro con valor inicial"C:\Windows\py.exe" "%1"
y la agregué%*
al final como nota de otras respuestas:Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Applications\py.exe\shell\open\command] @="\"C:\\Windows\\py.exe\" \"%1\" %*"
Para obtener información, antes de intentar configurar estas claves y valores y no ayudó (al menos antes de lo mencionado anteriormente):
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\" %*"
fuente
Tuve que modificar esto en Windows 10 para que funcionara (% * al final)
Computadora \ HKEY_USERS \ S-1-5-21-2364940108-955964078-1358188674-1001 \ Software \ Classes \ Applications \ py.exe \ shell \ open \ command
fuente