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. 解析文件的shebang ( 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>

由于我的问题在混合外部脚本的各种项目中很常见,我想知道是否已经实施了一个优雅的解决方案......

我们可以使用与脚本同名的可执行文件。运行此可执行文件时,它会读取位于同一目录中的脚本,解析shebang并使用指定的解释器执行此脚本。

演示:

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

1

我终于找到了,我在这里发布我的解决方案对其他人有用;)

GitHub上有两个项目:

  • snaury/script-runner -->查找命名文件(其中在编译时定义,如,或空),对于每个现有文件,使用相应的解释器执行脚本(在编译时定义,如,,,)。我已经分叉了它并扩展到了python。[script].exe[script].ext.ext.rb.pl.tcl[script].extscript-runnerruby.exeperl.exetclsh.exetclkitsh.exe

  • CBWhiz/RunHiddenCmd -->将其命令行参数传递给具有相同文件名(、、或)的本地文件。用于或。_[targetfilename].exe[targetfilename][targetfilename].cmd[targetfilename].batRunHiddenCmdcmd.exe.cmd.bat

我的叉子:

于 2013-10-19T16:26:30.197 回答
0

对于 Windows,我会推荐Python Launcherpy.exe在 Python 安装过程中可选安装)。它可以完成您要求的工作。

在开发多平台应用程序时,仍然建议使用 shebang 分布式脚本。将 in参数中提到setuptools的脚本的 shebang 更改为适合目标平台的值:https ://docs.python.org/3/distutils/setupscript.html#installing-scriptsscriptssetuptools.setup()setup.py

于 2021-06-17T11:31:54.490 回答