我有一个批处理文件,它试图运行第一行中指定的程序。类似于Unix的shebang:
C:\> more foo.bat
#!C:\Python27\python.exe
%PYTHON% foo-script.py
C:\>
我想知道的是:有没有办法自动将%PYTHON%
设置为C:\Python27\python.exe
,这是在shebang之后的脚本的第一行中指定的({ {1}})?
背景:我正在尝试这样做,以便在包装器脚本中显式指定要调用的Python解释器(因为系统上安装了多个Python解释器)。
假设:您可以假设脚本已经知道它自己的文件名(#!
),而%~dp0
是此脚本的目录。我们如何阅读不包括shebang的第一行?
澄清:将C:\ PythonXY添加到%PATH%不是解决方案。 shebang行应该在用户机器的安装时间(原始脚本仅在构建机器上生成)中进行修改..这可能有多个相同版本的Python安装。只有shebang行是可修改的(这就是程序的工作方式)。
答案 0 :(得分:4)
首先,在Windows上,不需要shebang。最好将Python解释器的路径包含在运行脚本的用户的PATH环境变量中。也就是说,要批量获取第一行,您可以使用set
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
答案 1 :(得分:0)
Shebangs只是Unix / Linux / BSD变体文件系统的原生,由于它们的设计和布局,文件系统知道当文件以shebang开头时,文件系统触发用户的终端进程调用shell基于shebang,通常是/bin/sh
。这可以通过浏览文件系统例程here来确认。
编辑:编辑了我的答案,以便在Windows环境中完全清楚。
简而言之,这在Windows(2000以上到Windows 7)中是不可能的,因为NTFS缺乏解释数据内容的这种能力(NTFS不关心文件中的内容),因此缺乏手段有一个exec
调用来加载shebang脚本,只有.EXE,.DLL,.SYS,。DRV可以满足,但对于脚本....
希望这有帮助, 最好的祝福, 汤姆。