¿Cómo ejecutar scripts de Python en Windows?
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 un argumento, pero si ejecuto el script mediante:
blah.py argument
se produce un error:
Error de índice...
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?
Cuando ejecuta un script sin escribir "python" al principio, necesita saber dos cosas sobre cómo Windows invoca el programa. Lo primero es averiguar qué tipo de archivo cree Windows que es:
C:\>asociación .py .py=Python.Archivo
A continuación, necesita saber cómo ejecuta Windows las cosas con esa extensión. Está asociado con el tipo de archivo "Python.File", por lo que este comando muestra lo que hará:
C:\>ftipo 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 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ás en condiciones de resolver el resto del problema por ti 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 votos positivos en sus preguntas, obtienen puntos de reputación y más personas probablemente les ayuden con buenas respuestas.)
Traído de los comentarios:
Incluso si assoc y ftype muestran la información correcta, puede suceder que los argumentos se eliminen. Lo que puede ayudar en ese caso es corregir 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. De manera similar, establezca
HKEY_CLASSES_ROOT\py_auto_file\shell\open\command
al mismo valor. Consulte http://eli.thegreenplace.net/2010/12/14/problem-passing-arguments-to-python-scripts-on-windows/
HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command
La ruta del registro puede variar, usar python26.exe
o python.exe
lo que ya esté en el registro.
HKEY_CLASSES_ROOT\py_auto_file\shell\open\command
debe hacer que la aplicación predeterminada para manejar archivos Python sea python.exe.
haga clic derecho en un archivo *.py, seleccione el cuadro de diálogo "Abrir con". Allí seleccione "python.exe" y marque "usar siempre este programa para este tipo de archivo" (algo así).
entonces sus archivos de Python siempre se ejecutarán usando python.exe
¿Cómo ejecutar scripts de Python en Windows?
Podrías 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 secuencia de comandos 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. Podrías usar la sintaxis compatible con *nix #! /usr/bin/env python
.
Puede especificar la versión explícitamente, por ejemplo, para ejecutarla con la última versión instalada de Python 3:
T:\> py -3 blah.py argument
También debería solucionar su sys.argv
problema como efecto secundario.
Encontré el mismo problema pero en el contexto de la necesidad de empaquetar mi código para usuarios de Windows (procedentes de Linux). Mi paquete contiene varios scripts con opciones de línea de comando.
Necesito que estos scripts se instalen en la ubicación adecuada de 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 un script de Python test
, cree dos archivos: a test.bat
y a test-script.py
.
test.bat
tiene el siguiente aspecto (los .bat
archivos en Anaconda\Scripts
llamada python.exe
con 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 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 .bat
archivo haciendo
test.bat hello world
['C:\\...\\test-scripy.py', 'hello', 'world']
Si copia ambos archivos a una ubicación que esté en su PATH
(como Anaconda\Scripts
), entonces puede incluso invocar su secuencia de comandos omitiendo el .bat
sufijo
test hello world
['C:\\...Anaconda\\Scripts\\test-scripy.py', 'hello', 'world']
Descargo de responsabilidad: no tengo idea de qué está pasando ni cómo funciona, por lo que agradecería cualquier explicación.