Я разрабатываю переносную конструкцию. В Linux система работает отлично. Однако в Windows фреймворк не может выполнять сценарии: Windows позволяет запускать только *.exe
и *.com
.запустить сценарий на окнах, не указывая явно интерпретатор (например, в Linux)
Вопрос: Есть ли исполняемый файл (*.exe
или *.com
), что:
- читает файл, имеющий такое же имя файла, за исключением
.exe
расширения (bar.py.exe
->bar.py
) - поиск этого файла в тот же каталог (
C:\dir\bar.py.exe
->C:\dir\bar.py
) - анализирует файл shebang файла (
bar.py
->#!/usr/bin/python
) - выполняет интерпретатор (
python
) - передает имя сценария (
C:\dir\bar.py
или/c/dir/bar.py
или/cygdrive/c/dir/bar.py
) - также передает параметры своей командной строки
Я не знаю, как найти a такой проект ...
Ниже более подробная информация, чтобы лучше понять мою проблему.
Детали:
рамки Мое здание на основе 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:
<target name="repo.init">
<exec executable="python" dir="${dir}">
<arg value="repo" />
<arg value="init" />
<arg value="-u" />
<arg value="${url}" />
</exec>
</target>
Поэтому я попытался batch script запуска сценария 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()
). Но я бы предпочел снова использовать аналогичный инструмент, уже разработанный.
Я открыт для любых других идей, решающих эту проблему ...