1

我有一个批处理文件,它试图运行第一行中指定的程序。类似于 Unix 的shebang

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

我想知道的是:有没有办法自动设置%PYTHON%C:\Python27\python.exeshebang()之后的脚本第一行中指定的值#!

背景:我正在尝试这样做,以便在包装脚本中明确指定要调用的 Python 解释器(因为系统上安装了多个 Python 解释器)。

假设:您可以假设脚本已经知道它自己的文件名(foo)并且%~dp0是该脚本的目录。我们如何阅读不包括 shebang 的第一行?

澄清:将 C:\PythonXY 添加到 %PATH% 不是解决方案。shebang 行应该在用户机器上的安装期间进行修改(原始脚本仅在构建机器上生成).. 可能有多个相同版本的 Python 安装。并且只有 shebang 行是可修改的(这就是程序的工作方式)。

4

2 回答 2

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
于 2010-01-27T01:20:58.333 回答
0

Shebangs 仅原生于 Unix/Linux/BSD 变体的文件系统,由于它们的设计和布局,文件系统知道当文件以 shebang 开头时,文件系统会触发用户的终端进程以调用基于 shebang 的 shell,通常/bin/sh. 这可以通过浏览此处的文件系统例程来确认

编辑:已编辑我的答案,使其在 Windows 环境的上下文中完全清楚。

简而言之,这在 Windows(2000 至 Windows 7)下是不可能的,因为 NTFS 缺乏解释数据内容的能力(NTFS 不关心文件中的内容),因此缺乏exec调用的方法要加载 shebang 脚本,仅适用于 .EXE、.DLL、.SYS、.DRV,但适用于脚本....

希望这会有所帮助,最好的问候,汤姆。

于 2010-01-27T01:36:32.623 回答