¿Cómo ejecutar scripts de Python en Windows?

91

Tengo un script simple blah.py (usando Python 2):

import sys
print sys.argv[1]

Si ejecuto mi script por:

python c:/..../blah.py argument

Imprime el argumento pero si ejecuto el script por:

blah.py argument

se produce un error:

IndexError ...

Entonces los argumentos no pasan al script.

python.exe en RUTA. Carpeta con blah.py también en PATH.
python.exe es el programa predeterminado para ejecutar archivos * .py.

¿Cuál es el problema?

ton4eg
fuente
3
publicar un fragmento de código puede ayudarnos a ayudarlo.
jldupont
El hombre sin bola de cristal ya ha dado una solución =) print sys.argv [1] produce este error.
ton4eg
Si tiene varias versiones de Python instaladas, es posible que necesite este stackoverflow.com/questions/1934675/… .
laike9m
Dile manualmente a Python que ejecute mi script desde el registro: "C: \ Python27 \ python.exe" "C: \ Python27 \ tpt.py" "% 1" `

Respuestas:

144

Cuando ejecuta un script sin escribir "python" al principio, necesita saber dos cosas sobre cómo Windows invoca el programa. Primero es averiguar qué tipo de archivo cree Windows que es:

    C: \> assoc .py
    .py = Python.File

A continuación, debe saber cómo Windows está ejecutando las cosas con esa extensión. Está asociado con el tipo de archivo "Python.File", por lo que este comando muestra lo que estará haciendo:

    C: \> ftype Python.File
    Python.File = "c: \ python26 \ python.exe" "% 1"% *

Entonces, en mi máquina, cuando escribo "blah.py foo", ejecutará este comando exacto, sin diferencia en los resultados que si hubiera escrito todo el texto yo mismo:

    "c: \ python26 \ python.exe" "blah.py" foo

Si escribe lo mismo, incluidas las comillas, obtendrá resultados idénticos a cuando simplemente escribe "blah.py foo". Ahora está en condiciones de resolver el resto del problema por sí mismo.

(O publique más información útil en su pregunta, como copias reales de cortar y pegar de lo que ve en la consola. Tenga en cuenta que las personas que hacen ese tipo de cosas obtienen votaciones en sus preguntas, obtienen puntos de reputación y más personas es probable que les ayuden con buenas respuestas).

Traído de los comentarios:

Incluso si assoc y ftype muestran la información correcta, puede suceder que se eliminen los argumentos. Lo que puede ayudar en ese caso es arreglar directamente las claves de registro relevantes para Python. Selecciona el

HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\command

clave para:

"C:\Python26\python26.exe" "%1" %*

Probablemente, anteriormente, %*faltaba. Del mismo modo, establezca

 HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

al mismo valor. Ver http://eli.thegreenplace.net/2010/12/14/problem-passing-arguments-to-python-scripts-on-windows/

ejemplo de configuración de registro para python.exe HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\commandLa ruta de acceso puede variar, el uso python26.exeo la python.exeo lo que ya está en el registro.

ingrese la descripción de la imagen aquí HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

Peter Hansen
fuente
30
Incluso si assocy ftypemuestra la información correcta, puede suceder que se eliminen los argumentos. Lo que puede ayudar en ese caso es arreglar directamente las claves de registro relevantes para Python. Establezca la HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\commandclave en: "C:\Python26\python26.exe" "%1" %* Probablemente, anteriormente, %*faltaba. Del mismo modo, establezca HKEY_CLASSES_ROOT\py_auto_file\shell\open\commandel mismo valor. Ver eli.thegreenplace.net/2010/12/14/…
parvus
5
@parvus Tu comentario fue la solución definitiva para mí. Incluso con las asociaciones leyendo correctamente, estas dos claves se establecieron incorrectamente.
Nathan Cox
1
También me he encontrado con problemas con HKEY_CLASSES_ROOT \ .py \ OpenWithProgids configurado en algo relacionado con VisualStudio, específicamente cuando intento ejecutar scripts de Python en mis pruebas de AppVeyor. Consulte help.appveyor.com/discussions/problems/… .
Jack O'Connor
1
Tengo un problema similar. Anaconda por defecto agregó la clave de registro con% * faltante
prasad
En Win10 escribo test.py 123y me 123imprimen como sys.argv[1]. ¿Microsoft cambió algo?
Hrvoje T
22

debe hacer que la aplicación predeterminada para manejar archivos de Python sea python.exe.

haga clic con el botón derecho en un archivo * .py, seleccione el cuadro de diálogo "Abrir con". Allí, seleccione "python.exe" y marque "utilizar siempre este programa para este tipo de archivo" (algo así).

entonces sus archivos de Python siempre se ejecutarán usando python.exe

santosc
fuente
16

Además, si desea poder ejecutar sus scripts de Python sin escribir .py(o .pyw) al final del nombre del archivo, debe agregar .PY(o .PY;.PYW) a la lista de extensiones en la variable de entorno PATHEXT.

En Windows 7:

haga clic con el botón derecho en Computadora
, haga clic con el botón
izquierdo en Propiedades, haga clic con el botón izquierdo en Configuración avanzada del sistema
, haga clic con el botón izquierdo en la pestaña Avanzado, haga clic con el botón
izquierdo en Variables de entorno ...
en "variables del sistema", desplácese hacia abajo hasta que vea PATHEXT
, haga clic con el botón izquierdo en PATHEXT para resaltarlo a la
izquierda- haga clic en Editar ...
Editar "Valor de la variable" para que contenga ;.PY (la tecla Fin saltará hasta el final)
haga clic en Aceptar
, haga clic en Aceptar
, haga clic en Aceptar, haga clic en Aceptar

Nota n. ° 1: las ventanas del símbolo del sistema no verán el cambio sin que se cierren y vuelvan a abrir.

Nota # 2: la diferencia entre las extensiones .pyy .pywes que la primera abre un símbolo del sistema cuando se ejecuta y la segunda no.

En mi computadora, agregué ;.PY;.PYWcomo las últimas extensiones (de menor prioridad), por lo que los valores "antes" y "después" de PATHEXT fueron:

antes de: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

después .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

Aquí hay algunos comandos instructivos:

C:\>echo %pathext%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

C:\>assoc .py
.py=Python.File

C:\>ftype Python.File
Python.File="C:\Python32\python.exe" "%1" %*

C:\>assoc .pyw
.pyw=Python.NoConFile

C:\>ftype Python.NoConFile
Python.NoConFile="C:\Python32\pythonw.exe" "%1" %*

C:\>type c:\windows\helloworld.py
print("Hello, world!")  # always use a comma for direct address

C:\>helloworld
Hello, world!

C:\>
Dave Burton
fuente
4

¿Cómo ejecutar scripts de Python en Windows?

Podría instalar pylauncher . Se utiliza para iniciar archivos .py, .pyw, .pyc, .pyo y admite múltiples instalaciones de Python:

T\:> blah.py argument

Puede ejecutar su script de Python sin especificar la extensión .py si tiene .py, .pyw en la variable de entorno PATHEXT:

T:\> blah argument

Agrega soporte para shebang (#! línea de encabezado) para seleccionar la versión deseada de Python en Windows si tiene varias versiones instaladas. Puede usar una sintaxis compatible con * nix #! /usr/bin/env python.

Puede especificar la versión explícitamente, por ejemplo, para ejecutar con la última versión instalada de Python 3:

T:\> py -3 blah.py argument

También debería solucionar su sys.argvproblema como efecto secundario.

jfs
fuente
Python Launcher está en estado beta.
Nicolas Barbulesco
@NicolasBarbulesco: el lanzador de Python está incluido en Python 3.3 , es decir, es lo suficientemente bueno
jfs
Tal vez. Pero no logré instalar Python 3 en Windows . Quizás puedas ayudarme aquí.
Nicolas Barbulesco
4

Encontré el mismo problema pero en el contexto de la necesidad de empaquetar mi código para usuarios de Windows (provenientes de Linux). Mi paquete contiene varios scripts con opciones de línea de comandos.

Necesito que estos scripts se instalen en la ubicación adecuada en las máquinas de los usuarios de Windows para que puedan invocarlos desde la línea de comandos. Como el paquete supuestamente es fácil de usar, sería imposible pedir a mis usuarios que cambien su registro para ejecutar estos scripts.

Encontré una solución que la gente de Continuum usa para los scripts de Python que vienen con su paquete Anaconda; consulte su directorio Anaconda / Scripts para ver ejemplos.

Para una secuencia de comandos de Python test, cree dos archivos: ay test.batatest-script.py .

test.batse ve como sigue (los .batarchivos en la Anaconda\Scriptsllamada python.execon una ruta relativa que adapté para mis propósitos):

@echo off
set PYFILE=%~f0
set PYFILE=%PYFILE:~0,-4%-script.py
"python.exe" "%PYFILE%" %*

test-script.py es su secuencia de comandos de Python real:

import sys
print sys.argv

Si deja estos dos archivos en su directorio local, puede invocar su script Python a través del .batarchivo haciendo

test.bat hello world
['C:\\...\\test-scripy.py', 'hello', 'world']

Si copia ambos archivos en una ubicación que está en su PATH(como Anaconda\Scripts), puede incluso invocar su script omitiendo el .batsufijo

test hello world
['C:\\...Anaconda\\Scripts\\test-scripy.py', 'hello', 'world']

Descargo de responsabilidad: no tengo idea de lo que está pasando y cómo funciona, por lo que agradecería cualquier explicación.


fuente
Crear un .batcontenedor para cada script de Python es torpe y redundante. No recomendaría esto.
triplicado
2

En Windows ,

A ejecutar un módulo de Python sin escribir "python" ,

-> Haga clic derecho en cualquier archivo de python (*. Py)

-> Establezca la propiedad open with en "python.exe"

-> Marque la casilla "usar siempre este programa para este tipo de archivo"

-> Agregue la ruta de python.exe al entorno variable, por ejemplo, agregue C: \ Python27 a la variable de entorno PATH.

A ejecutar un módulo de Python sin escribir la extensión ".py"

-> Edite la variable de sistema PATHEXT y agregue la extensión ".PY" a la lista.

Aspak Rogatiya
fuente
1

Encontré una respuesta increíblemente útil aquí : ¿Cómo ejecutar diferentes versiones de Python en cmd?

Sugeriría usar la utilidad Python Launcher para Windows que se introdujo en Python 3.3 hace un tiempo. También puede descargarlo e instalarlo manualmente directamente desde el sitio web del autor para usarlo con versiones anteriores de Python 2 y 3.

Independientemente de cómo lo obtenga, después de la instalación se habrá asociado con todas las extensiones de archivo estándar de Python (es decir, archivos .py, .pyw, .pyc y .pyo). No solo podrá controlar explícitamente qué versión se usa en el símbolo del sistema, sino también script por script agregando comentarios de Linux / Unix-y shebang #! / Usr / bin / env pythonX en el comienzo de sus scripts de Python.

Como sugiere JF Sebastian, Python Launcher para Windows es la mejor opción predeterminada para lanzar diferentes versiones de Python en Windows. Solía ​​ser una herramienta de terceros, pero ahora es oficialmente compatible desde Python 3.3.

Nuevo en la versión 3.3.

El lanzador de Python para Windows es una utilidad que ayuda en la ubicación y ejecución de diferentes versiones de Python. Permite que los scripts (o la línea de comandos) indiquen una preferencia por una versión específica de Python, y localizarán y ejecutarán esa versión.

¡Esta es una gran herramienta, solo úsala!

laike9m
fuente
0

¿Puedes ejecutar python.exe desde cualquier mapa? Si no es así, compruebe si tiene los valores adecuados para python.exe en el entorno PATH

¿Está en el mismo directorio que blah.py. Verifique esto emitiendo el comando -> editar blah.py y verifique si puede abrir este archivo

EDITAR:

En ese caso no puedes. ( Python arg significa que usted llama a python.exe con algunos parámetros que python asume que es el nombre de archivo del script que desea ejecutar)

Puede crear un archivo bat con líneas en su mapa de ruta y ejecutar el archivo .bat

Ejemplo:
en uno de los mapas de ruta, cree el archivo de edición blah.py.bat y coloque la línea

python C:\Somedir\blah.py

Ahora puede ejecutar blah.py desde cualquier lugar, ya que no necesita poner extensión .bat al ejecutar archivos bat

Luka Rahne
fuente
python en PATH. Y directorio que contiene blah.py también en PATH. La idea principal es ejecutar un script de Python sin escribir la ruta completa. Pero ahora tengo problemas para pasar argumentos.
ton4eg
3
Ralu, no necesitas un archivo por lotes para ejecutar un script de Python de esta manera. Utilice la var de entorno PATHEXT para incluir .py y .pyw como extensiones ejecutables. Esta var es la razón por la que tampoco es necesario especificar .bat.
Todd
0

Si eso es lo que entendí, es así:

C:\Users\(username)\AppData\Local\Programs\Python\Python(version)

COPIAR (no eliminar) python.exe y cambiar el nombre a py.exe y ejecutar:

py filename.py
Lucas Paz
fuente
0

Simplemente ejecute el comando:

C:>python .\file_name.py

Suponiendo que el nombre del archivo está dentro de la misma carpeta y Python ya se ha agregado a las variables de entorno.

Mwiza
fuente