2013-09-23 1 views
1

Я разрабатываю переносную конструкцию. В Linux система работает отлично. Однако в Windows фреймворк не может выполнять сценарии: Windows позволяет запускать только *.exe и *.com.запустить сценарий на окнах, не указывая явно интерпретатор (например, в Linux)

Вопрос: Есть ли исполняемый файл (*.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. также передает параметры своей командной строки

Я не знаю, как найти 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()). Но я бы предпочел снова использовать аналогичный инструмент, уже разработанный.

Я открыт для любых других идей, решающих эту проблему ...

ответ

0

Я наконец-то нашел, я выкладываю здесь мое решение, чтобы быть полезным для других;)

Есть два проекта на GitHub :

  • snaury/script-runner ->[script].exe ищет файлы с именем [script].ext (где .ext определяется во время компиляции, как .rb, .pl, .tcl или пустой) и для каждого существующего файла [script].ext, script-runner выполняет скрипт, используя соответствующий интерпретатор (определяется во время компиляции, как ruby.exe, perl.exe, tclsh.exe, tclkitsh.exe). У меня есть forked it и расширен до python.

  • CBWhiz/RunHiddenCmd ->[targetfilename].exe передает свои параметры командной строки для локального файла, имеющего такое же имя файла ([targetfilename], [targetfilename].cmd или [targetfilename].bat). RunHiddenCmd использует cmd.exe для .cmd или .bat.

Моя вилка:

Смежные вопросы