Windows no pasa argumentos de línea de comando a programas Python ejecutados desde el shell

87

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" %*
mckoss
fuente
Sin embargo, funciona para mí. C: \ Documents and Settings \ Quim> test foo Args: ['foo'] Situé test.py en la ubicación inicial de cmd.exe (% HOMEDRIVE %% HOMEPATH% en propiedades). Por lo demás, no hay nada especial en mi configuración: winxp, Activepython 2.6.5
joaquin
¿Podría utilizar RegScanner y encontrar todas las apariciones de Python.Fileen su registro?
Piotr Dobrogost
2
Vaya, qué error tan frustrante :( ¡Acabo de reinstalar Python y todavía está roto! El error se informó en el rastreador de problemas de Python hace dos años, bugs.python.org/issue7936, pero no hay solución; pocos de los desarrolladores usan Windows.
Colonel Panic
2
Me encontré con esto cuando instalé Python 3.4 e intenté usar Python 2.7. ¿Parece que el instalador de Python 3.4 lo estropeó?
Dogmatixed
Si el sistema está usando [HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exeo [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.FileProgId estándar . Verifique la shell\open\commandsubclave 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" %*.
Eryk Sun

Respuestas:

106

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

mckoss
fuente
8
Mi clave se encuentra aquí en Windows 7: HKEY_USERS \ S-1-5-21-2829634124-923609355-2255922086-1001 \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command
Steven Keith
4
Con el valor: C: \ Python26 \ python.exe% 1% *
Steven Keith
2
Funcionó para mí, recuerde que la respuesta de mckoss es un escape o un archivo .REG si está editando los valores, eliminó directamente los escapes allí
fedmich
3
En una nota al margen: la causa raíz de esto podría deberse a una asociación de archivo inicial con archivos .py antes de la instalación de Python. Me encontré con este problema, los archivos de tipo .py se habían asociado con el Bloc de notas y luego se instaló Python y este feo problema asomó su fea cabeza. En Windows 10 BTW.
g4m3c0d3r
2
Recientemente cambió el lanzador para usar C: \ Windows \ py.exe y encontré este error. Sin embargo, modifiqué la clave en la versión de @ StevenKeith, con "py.exe" sustituido por "python.exe"
Casey Kuball
14

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.

bainorama
fuente
10

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.

Cody Piersall
fuente
5

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

Para que funcione para mí, tuve que usar la ruta del registro:

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

y agregó un %*

rundekugel
fuente
0

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
hughdbrown
fuente
0

Es posible que sus asociaciones de programas para .pyarchivos estén dañadas. Simplemente vuelva a asociar los .pyarchivos con su ejecutable de Python.

Haga clic derecho en un .pyarchivo> Open with> Choose default program ...> [encontrar C: \ PythonXY \ python.exe]

congusbongus
fuente
No funcionó en mi sistema, ya que siempre llamaba de forma predeterminada a Python 3.6. La respuesta seleccionada funcionó
Aaron3468
Hay problemas desde Windows10, por lo que esto no siempre funciona.
rundekugel
0

Verifiqué todas las claves de registro con python.exey las py_auto_filehice apuntar a mi instalación actual de Python, incluido %*el final que pasa argumentos. Fueron bastantes:

  • HKEY_CLASSES_ROOT \ Aplicaciones \ 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 programa \ 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 \ Aplicaciones \ 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 funcionó para mí. También tuve que cambiar mi aplicación de Python predeterminada.

Diálogo de aplicación

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.

MrLeeh
fuente
0

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

Cuando escribo python app.py argsen 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" %*.

Richard Mateosian
fuente
0

Si soluciono esto 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" %*
Stuw
fuente
0

¡Muchas gracias por la mayoría de las otras respuestas por ayudarme a encontrar la solución!

Mi caso fue abrir .pyarchivos con py.exe(no python.exedirectamente), 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 .pyarchivos asociados C:\Windows\py.exey en la C:\Windows\py.iniconfiguración tengo un par de definiciones de shebang

[commands]
<my_venv_py> = C:\Programs\my_venv_py\Scripts\python.exe
<my_venv_py_w> = C:\Programs\my_venv_py\Scripts\pythonw.exe

para 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 .regarchivo 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\" %*"

and1er
fuente
0

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

Arunex
fuente