Windows no está pasando argumentos de línea de comandos a progtwigs Python ejecutados desde el shell

Tengo problemas para que los argumentos de la línea de comandos se pasen a los progtwigs de Python si bash ejecutarlos directamente como comandos ejecutables desde una consola de comandos de Windows. Por ejemplo, si tengo este progtwig (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" %* 

Creo que resolví esto. Por alguna razón, hay un SEGUNDO lugar en el registro (además del mostrado por 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 en 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).

Mi configuración 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.

Para Python 3.3 en Windows 7, mi configuración estaba bajo otra clave de registro; La clave que cambié para hacer que los argumentos fueran aprobados fue

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

Era "C:\Python\Python33\python.exe" "%1" . Solo le agregué %* . El valor de la clave ahora es "C:\Python\Python33\python.exe" "%1" %* .

Tuve varias (al menos cinco) otras claves con el valor "C:\Python\Python33\python.exe" "%1" , pero esta es la que cambié que la hizo funcionar.

Para hacerlo funcionar, tuve que usar la ruta del registro:

 HKEY_CLASSES_ROOT\py_auto_file\shell\open\command 

y agregó un %*

Aquí están los archivos .reg para corregir 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\" %*" 

Interesante. Funciona aquí usando 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 

Las asociaciones de su progtwig para archivos .py pueden estar en mal estado. Solo vuelve a asociar los archivos .py con tu ejecutable de Python.

Haga clic con el botón derecho en un archivo .py > Open with > Choose default program ... > [buscar C: \ PythonXY \ python.exe]

python.exe todas las claves de registro con python.exe y py_auto_file y les hice apuntar a mi instalación actual de python, incluyendo th %* al final que pasa los argumentos. Eran unos cuantos

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

    • org: “C: \ miniconda3 \ python.exe” “% 1” “% *”
    • cambiado: “C: \ Python35 \ python.exe” “% 1” “% *”
  • HKEY_CLASSES_ROOT \ py_auto_file \ shell \ open \ command

    • org: “C: \ Archivos de progtwig \ Sublime Text 3 \ sublime_text.exe” “% 1”
    • cambiado: “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”
    • cambiado: “C: \ Python35 \ pythonw.exe” “% 1” “% *”
  • HKEY_CURRENT_USER \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command

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

Pero eso no hizo el trabajo por mí. También tuve que cambiar mi aplicación predeterminada de python.

Diálogo de aplicación

Como se puede ver tengo 3 versiones de Python instaladas. Es imposible ver cuál es el que aquí, así que probé los tres como mi aplicación predeterminada de python. Finalmente pude obtener mis argumentos de script con uno de estos tres.

Al buscar en el registro de Windows, encontré todos los lugares donde Python36\pythonw.exe "%1" %* algo como Python36\pythonw.exe "%1" %* .

Cuando 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.

Al parecer, Windows sabe lo suficiente como para pasar un archivo py a Python, pero no puedo entender las entradas del registro cómo construye el comando. Parece que usa "%1" lugar de "%1" %* .

Si esto se solucionó en mi sistema Windows 10 editando las siguientes claves de registro:

 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 

a este valor:

 "C:\Python27\python.exe" "%1" %*