【问题标题】:Read the first line of batch file from the same batch file?从同一个批处理文件中读取批处理文件的第一行?
【发布时间】:2010-01-27 01:09:16
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 为什么不将 C:\Python27 添加到 Windows PATH 环境变量中?
  • @Yada: C:\Python27 已经在 PATH 中;但是,C:\Python25、C:\Python26、C:\Python31 等也是如此。此外,此脚本的 shebang 将在安装期间修改

标签: python windows batch-file shebang


【解决方案1】:

首先,在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

【讨论】:

  • 要添加到 PATH,请参阅我最近在问题中添加的说明。
  • 呃,我刚刚意识到#! 不是注释,而是批处理文件中的无效语法。整个想法都崩溃了。
  • 不过,我至少可以使用rem #!&lt;path&gt;
  • 它对我来说很好,请参阅我的输出。显示给出错误的代码(在您的原始帖子中)
  • @ghostdog74:我之前在批处理文件中有 shebang 行。所以很明显这没有用。但是将 shebang 移动到 Python 脚本是理想的解决方案(正如您也编辑过的那样)。
【解决方案2】:

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

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

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

希望这会有所帮助, 最好的祝福, 汤姆。

【讨论】:

  • 请注意 setuptools/Distribute 已经使用 shebang 在 Windows 上模拟 exe 包装器。 foo.exe 调用foo-script.py 中指定的shebang 解释器。 packages.python.org/distribute/…
  • @tommieb75,shebang 与文件系统无关;如果您有一个带有 shebang 的脚本保存在 FAT32 或 NTFS 文件系统上,但您从可以读取 FAT32 或 NTFS 的 UNIX 变体执行它,该命令仍然有效——关键在于操作系统如何实现“exec”和朋友,而不是文件系统。
  • @Michael:引用您的评论“如果您有一个带有 shebang 的脚本保存在 FAT32 或 NTFS 文件系统上,但您从可以读取 FAT32 或 NTFS 的 UNIX 变体执行它,该命令将仍然有效' - 你的答案中的扭曲!!!!这意味着它可以在 Linux/BSD 变体下工作,当然它可以工作,因为 NTFS/FAT32 分区已经被挂载并且 fs 会知道如何处理 shebangs !!!我的答案是在 Windows 环境和 ntfs 的上下文中和来自的上下文!!!
  • 我认为您误解了这个问题。我认为这个问题更像是“知道 shebang 在 Windows 上不起作用,我想在 Windows 上使用批处理脚本来模拟它”。正如 OP 后来发现的那样,#!... 不是有效的批处理文件语法。
  • 布莱恩是正确的。但即使#!.. 不是有效的批处理文件语法,它在被包装 的Python 脚本中也是有效的。批处理文件将始终调用它 wrapping 的脚本 - 该脚本将提供 shebang。这就是 Python 的 setuptools 实现其 exe 包装器的方式(除了它使用二进制可执行文件而不是批处理文件)
最近更新 更多