2010-01-27 243 views
2

我有一個批處理文件,它嘗試運行第一行指定的程序。類似Unix的shebang從同一批處理文件中讀取批處理文件的第一行?

C:\> more foo.bat 
#!C:\Python27\python.exe 
%PYTHON% foo-script.py 
C:\> 

我想知道的是:有沒有辦法來自動設置%PYTHON%C:\Python27\python.exe這是在家當(#!)以下腳本的第一行中指定?

背景:我想這樣做,以便明確指定Python解釋器在包裝腳本中調用(因爲系統上安裝了多個Python解釋器)。

假設:你可以假設腳本已經知道它自己的文件名(foo)和%~dp0是這個腳本的目錄。我們如何閱讀不包括shebang的第一行?

澄清:將C:\ PythonXY添加到%PATH%不是解決方案。 shebang行應該在安裝期間被修改(原始腳本僅在構建機器上生成)在用戶的機器上..可能有多個相同版本的Python安裝。只有shebang行是可修改的(這是程序的工作原理)。

+1

爲什麼不把C:\ Python27添加到Windows PATH環境變量? – Yada 2010-01-27 01:20:12

+0

@Yada:C:\ Python27已經在PATH中;但是,C:\ Python25,C:\ Python26,C:\ Python31等也是如此。此外,該腳本的shebang將在安裝期間被*修改*。 – 2010-01-27 01:24:26

回答

4

首先,在windows上,沒有必要使用shebang。最好將Python解釋器的路徑包含到運行腳本的用戶的PATH環境變量中。這就是說,要獲得批量的第一行,你可以使用設置

set /p var=<file 

,因爲你有解釋的多個版本,爲什麼不使用正確的,當你調用腳本?

c:\python27\bin\python.exe myscript.py 

編輯:

@echo off 
set /p var=<test.py 
call %var:~2% test.py 

輸出

C:\test>more test1.py 
#!c:\Python26\python.exe 

print "hello" 


C:\test>more test.bat 
@echo off 
set /p var=<test1.py 
call %var:~2% test1.py 

C:\test>test.bat 
hello 
+0

要添加到PATH,請參閱我最近在問題中添加的說明。 – 2010-01-27 01:34:55

+0

呃,我剛剛意識到'#!'不是註釋,而是批處理文件中無效的語法。整個想法已經崩潰。 – 2010-01-27 01:37:28

+0

但是,我至少可以使用rem#! '。 – 2010-01-27 01:39:12

0

Shebangs只有本土的Unix/Linux/BSD變體的文件系統,由於其設計和佈局,文件系統知道當一個文件以shebang開頭時,文件系統會觸發用戶的終端進程來調用基於shebang的shell,通常爲/bin/sh。這可以通過瀏覽文件系統例程here來確認。

編輯:編輯過我的答案,以便在Windows環境中充分說明問題。

總之,在Windows(2000以上到Windows 7)下這是不可能的,因爲NTFS缺乏解釋數據內容的能力(NTFS不關心文件中的內容),因此缺乏方法具有一個exec調用來加載認領腳本,只有.exe,.dll,.SYS,.DRV的被照顧,但一個腳本....

希望這有助於 最好的問候, 湯姆。

+0

請注意,setuptools/Distribute已經使用shebang來模擬Windows上的exe包裝。 'foo.exe'調用'foo-script.py'中指定的shebang解釋器。 http://packages.python.org/distribute/setuptools.html#automatic-script-creation – 2010-01-27 02:44:06

+1

@ tommieb75,shebang與文件系統無關;如果你有一個保存在FAT32或NTFS文件系統中的shebang腳本,但是你可以從可以讀取FAT32或NTFS的UNIX變體中執行它,那麼該命令仍然可以工作 - 關鍵在於操作系統如何實現「exec」和朋友,而不是文件系統。 – 2010-01-27 05:16:29

+0

@Michael:引用你的評論'如果你有一個保存在FAT32或NTFS文件系統上的shebang腳本,但是你可以從可以讀取FAT32或NTFS的UNIX變體中執行它,那麼該命令仍然可以工作' - 你的答案!!!!這意味着它可以在Linux/BSD版本下運行,當然它可以工作,因爲NTFS/FAT32分區將被掛載,並且fs會知道如何處理shebang!我的答案是在Windows環境和NTFS環境下的! – t0mm13b 2010-01-27 12:46:29

相關問題