2010-03-18 9 views
7

A volte (nei PC del cliente) ho bisogno di uno script python da eseguire nella shell di Windows come .CMD o .BAT, ma senza avere la .py o estensioni .pyw associate a PYTHON/PYTHONW.Script Python "Bootstrap" nella shell di Windows senza le associazioni .py/.pyw

sono uscito con un paio di soluzioni 'Quick'n sporche':

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]" 

Sai una soluzione migliore? (Vale a dire: più concisa o elegante)


Aggiornamento:

in base alla risposta @van, il modo più conciso ho scoperto (senza impostare 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

Non vedo niente di sbagliato con la tua seconda soluzione (a parte il fatto che '||' dovrebbe essere '|'). Non è super elegante, ma fa il lavoro. –

+0

Typo, corretto, thx. – PabloG

risposta

9

È possibile provare a creare uno script che è sia python e windows shell script. In questo caso è possibile denominare il file my_flexible_script.bat ed eseguirlo direttamente o tramite python ....

Vedere un contenuto di pylint.bat file da 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 """ 

E 'simile a quello che fai, ma ha più compatibile dual-script supporto.

+0

Buono, il trucco rem = ""! quello che stavo cercando, thx – PabloG

+2

Questo tipo di programma è noto come poliglotta (http://en.wikipedia.org/wiki/Polyglot_%28computing%29). –

+0

Perché non il "@echo off" innescare un Sintassi Eccezione errore? –

0

Io uso il seguente distutils/py2exe script per produrre un singolo file eseguibile eseguibile:

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

Vedo che MSVCR71.DLL viene copiato nella directory dist di conseguenza ... ma è probabile che questa dipendenza sia già presente sul computer di destinazione.

+0

Devo dire che non voglio bloccare lo script, perché il mio scopo principale è usarlo come un "programma shell su steroidi", mantenendolo facilmente modificabile e modificabile – PabloG

Problemi correlati