2010-03-18 52 views
7

有時(在客戶的PC中)我需要一個python腳本來在Windows shell中執行,如.CMD或.BAT,但不需要.py或與PYTHON/PYTHONW相關的.pyw擴展名。沒有.py/.pyw關聯的Windows shell中的「Bootstrap」python腳本

我想出了一對 '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]" 

你知道一個更好的解決方案? (即:更簡潔或優雅)


更新:

基於@van答案,我發現(不設置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

我沒有看到你的第二個解決方案有什麼問題(除了'||'應該是'|')。這不是超級優雅,但它完成了工作。 – 2010-03-18 19:03:58

+0

錯字,更正,thx。 – PabloG 2010-03-18 19:13:16

回答

9

您可以嘗試創建一個既是python也是windows shell script的腳本。在這種情況下,您可以將您的文件命名爲my_flexible_script.bat,並直接或通過python ...執行。

pylint.bat文件從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 """ 

它類似於你做了什麼,但有更多的符合dual-script支持。

+0

好的,rem =「」「技巧!我在找什麼,thx – PabloG 2010-03-18 19:20:29

+2

這種類型的程序被稱爲polyglot(http://en.wikipedia.org/wiki/Polyglot_%28computing%29)。 – 2010-03-18 21:38:30

+0

爲什麼'@echo off'觸發a語法錯誤異常? – 2010-05-31 15:16:34

0

以下distutils/py2exe腳本生成單個可運行的可執行文件:

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

我看到MSVCR71.DLL因此被複制到dist目錄中......但是這種依賴性已經存在於目標機器上的可能性很高。

+0

我應該提到,我不想凍結腳本,因爲我的主要目的是像使用類固醇的「shell程序」一樣使用它,保持它容易編輯和修改 – PabloG 2010-03-18 19:12:37