1

ポータブル ビルディング フレームワークを開発しています。Linux では、フレームワークは完全に機能します。ただし、Windows では、フレームワークはスクリプトを実行できません。Windows では実行のみが許可さ*.exeれます*.com

質問: 次の実行可能ファイル (*.exeまたは*.com)はありますか?

  1. 拡張子を除いて同じファイル名を持つファイルを読み込みます.exe( bar.py.exe-> bar.py)
  2. 同じディレクトリでこのファイルを検索します ( C:\dir\bar.py.exe-> C:\dir\bar.py)
  3. ファイルのシバンを解析します ( bar.py-> #!/usr/bin/python)
  4. インタプリタを実行します ( python)
  5. スクリプトの名前 (C:\dir\bar.pyまたは/c/dir/bar.pyまたは/cygdrive/c/dir/bar.py)を渡します
  6. コマンドライン パラメータも渡します

そのようなプロジェクトを見つける方法がわかりません...

私の問題をよりよく理解するための詳細を以下に示します。


詳細:

私の構築フレームワークはAntに基づいています:

<target name="repo.init">
  <exec executable="repo" dir="${dir}">
    <arg value="init"   />
    <arg value="-u"     />
    <arg value="${url}" />
  </exec>
</target>

Windows では、Ant (java) は実行可能ファイルを見つけることができませんrepo

Windows のせいで Ant スクリプトを台無しにしたくありません。

<target name="repo.init">
  <exec executable="python" dir="${dir}">
    <arg value="repo"   />
    <arg value="init"   />
    <arg value="-u"     />
    <arg value="${url}" />
  </exec>
</target>

したがって、pythonスクリプトを実行するバッチスクリプトを試みました:

$ dir
2013-09-23  10:30       738  repo
2013-09-23  10:31        23  repo.bat
$ type repo.bat
python %~dp0/repo %*

しかし、同じエラー!私の同僚はcmd、いつAntからバッチファイルを実行するかを指定しています:(

<target name="repo.init">
  <exec executable="cmd" dir="${dir}">
    <arg value="/c"      />
    <arg value="repo.bat"/>
    <arg value="init"    />
    <arg value="-u"      />
    <arg value="${url}"  />
  </exec>
</target>

私の問題は、外部スクリプトを組み合わせたさまざまなプロジェクトで一般的であるため、エレガントなソリューションが既に実装されているかどうか疑問に思っています...

スクリプトと同じ名前の実行可能ファイルを使用できます。この実行可能ファイルが実行されると、同じディレクトリにあるスクリプトが読み取られ、シバンが解析され、指定されたインタープリターを使用してこのスクリプトが実行されます。

デモ:

C:\dir> dir
 Volume in drive C is OSDisk
 Volume Serial Number is 56A4-E980

 Directory of C:\dir

23/09/2013  17:19    <DIR>          .
23/09/2013  17:19    <DIR>          ..
23/09/2013  17:15            23 535 repo
23/09/2013  17:25            89 521 repo.exe
           2 File(s)        113 056 bytes
           2 Dir(s)  122 670 903 296 bytes free

C:\dir> head -1 repo
Unknown option: 1
[...]
C:\dir> powershell -command "& {get-content repo -totalcount 1}"  
#!/usr/bin/env python

C:\dir> repo.exe arg1 arg2
[... --> execute "python C:\dir\repo arg1 arg2" ...]

これは簡単に実装できます (たとえば、 を使用CreateProcess())。しかし、私はすでに開発された同様のツールを再利用したいと考えています。

この問題を解決する他のアイデアを受け入れます...

4

2 に答える 2

0

Windows の場合は、Python ランチャー( py.exePython のセットアップ時にオプションでインストールされます) をお勧めします。それはあなたが求めている仕事をします。

マルチプラットフォーム アプリケーションを開発する場合は、分散スクリプトにシバンを使用することをお勧めします。inの引数でsetuptools言及されているスクリプトのシバンを、ターゲット プラットフォームに適した値に変更します: https://docs.python.org/3/distutils/setupscript.html#installing-scriptsscriptssetuptools.setup()setup.py

于 2021-06-17T11:31:54.490 に答える