1

最初の行で指定されたプログラムを実行しようとするバッチ ファイルがあります。Unix のshebangに似ています:

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

私が知りたいのは、シバン ( ) に続くスクリプトの最初の行で指定されているものを自動的に設定%PYTHON%する方法はありますか?C:\Python27\python.exe#!

背景: ラッパー スクリプトで (システムに複数の Python インタープリターがインストールされているため) 呼び出す Python インタープリターを明示的に指定するために、これを実行しようとしています。

前提foo: スクリプトは、それ自体のファイル名 ( ) を既に認識しており%~dp0、このスクリプトのディレクトリであると想定できます。シバンを除いた最初の行をどのように読みますか?

明確化: C:\PythonXY を %PATH% に追加することは解決策ではありません。シバン行は、ユーザーのマシンでインストール時に変更されることになっています (元のスクリプトはビルド マシンでのみ生成されます)。これには、同じバージョンの Python が複数インストールされている可能性があります。そして、シバン行のみが変更可能です (これがプログラムの動作です)。

4

2 に答える 2

4

まず、Windows では、シバンは必要ありません。スクリプトを実行しているユーザーの PATH 環境変数に Python インタープリターのパスを含めることをお勧めします。そうは言っても、バッチで最初の行を取得するには、 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

シバンは、Unix/Linux/BSD バリアントのファイルシステムにのみネイティブであり、その設計とレイアウトにより、ファイルシステムは、ファイルがシバンで始まると、ファイルシステムがユーザーの端末プロセスをトリガーして、シバンに基づいてシェルを呼び出すことを認識しています。通常/bin/shこれは、こちらのファイルシステム ルーチンをブラウズすることで確認できます。

編集: Windows 環境のコンテキストで完全に明確にするために、回答を編集しました。

要するに、これは Windows (2000 から Windows 7 まで) では不可能です。NTFS にはデータの内容を解釈する機能がなく (NTFS はファイルの内容を気にしません)、exec呼び出しを行う手段がないからです。シバン スクリプトをロードするには、.EXE、.DLL、.SYS、.DRV のみが対象ですが、スクリプトの場合は....

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-01-27T01:36:32.623 に答える