2010-03-18 5 views
7

A veces (en las PC del cliente) Necesito un script de python para ejecutar en el shell de Windows como un .CMD o .BAT, pero sin tener el .py o extensiones .pyw asociadas con PYTHON/PYTHONW.Script de python "Bootstrap" en el shell de Windows sin asociaciones .py/.pyw

he salido con un par de soluciones 'sucias' Quick'n:

1)

""" 
e:\devtool\python\python.exe %0 :: or %PYTHONPATH%\python.exe 
goto eof: 
""" 
# Python test 
print "[works, but shows shell errors]" 

2)

@echo off 
for /f "skip=4 delims=xxx" %%l in (%0) do @echo %%l | e:\devtools\python\python.exe 
goto :eof 
::---------- 

# Python test 
print "[works better, but is somewhat messy]" 

¿Conoce una solución mejor? (Es decir: más concisa o elegante)


Actualización:

basado en respuesta @van, la forma más concisa que encontré (sin establecer ERRORLEVEL)

@e:\devtools\python\python.exe -x "%~f0" %* & exit /b 

### Python begins.... 
import sys 

for arg in sys.argv: 
    print arg 

raw_input("It works!!!\n") 

### 
+0

No veo nada malo con su segunda solución (aparte de que '||' debe ser '|'). No es súper elegante, pero hace el trabajo bien. –

+0

Typo, corregido, thx. – PabloG

Respuesta

9

Puede intentar crear un script que sea python y windows shell script. En este caso puede nombrar el archivo my_flexible_script.bat y ejecutarlo directamente o por python ....

Ver un contenido de pylint.bat archivo desde pylint:

@echo off 
rem = """-*-Python-*- script 
rem -------------------- DOS section -------------------- 
rem You could set PYTHONPATH or TK environment variables here 
python -x "%~f0" %* 
goto exit 

""" 
# -------------------- Python section -------------------- 
import sys 
from pylint import lint 
lint.Run(sys.argv[1:]) 


DosExitLabel = """ 
:exit 
exit(ERRORLEVEL) 
rem """ 

Es similar a lo que hace, pero tiene más compatible dual-script apoyo.

+0

Bueno, el truco rem = "" "Eso es lo que estaba buscando, thx – PabloG

+2

Este tipo de programa es conocido como un políglota (http://en.wikipedia.org/wiki/Polyglot_%28computing%29). –

+0

¿Por qué el '@echo off' no dispara un Sintaxis Error exception? –

0

utilizo el siguiente distutils/py2exe script para producir un único archivo ejecutable ejecutable:

from distutils.core import setup 
import py2exe, sys, os 

sys.argv.append('py2exe') 

setup(
    options = {'py2exe': {'bundle_files': 1}}, 
    console = [{'script': "MyScript.py"}], 
    zipfile = None, 
) 

Veo que MSVCR71.DLL se copia en el directorio dist como resultado ... pero hay muchas posibilidades de que esta dependencia ya esté en la máquina de destino.

+0

Debo mencionar que no quiero congelar el script, porque mi propósito principal es usarlo como un "programa shell con esteroides", manteniéndolo fácilmente editable y modificable. – PabloG

Cuestiones relacionadas