Исполняемый файл merge.exe (извлеченный из MSYS2) не запускается на Windows - PullRequest
1 голос
/ 06 августа 2020

1. Проблема объяснена

Мне нужно запустить инструмент merge (часть проекта GNU RCS - Система контроля версий) на Windows 10. Вот требования:

  • ШАГ 1: Исполняемый файл merge.exe должен работать в собственном терминале Windows cmd.
  • ШАГ 2: Переменная PATH env не должна изменяться.
  • ШАГ 3: Исполняемый файл может находиться в любой произвольной папке (конечно, можно поставить рядом с ним кучу dll, если требуется).

Это привело бы нас слишком далеко, чтобы объяснить , почему эти требования так важны. Пожалуйста, просто примите их «как есть».

2. Первая проба: запуск исполняемого файла msys

Я установил MSYS2 в C:/msys64 и нашел исполняемый файл в этом месте: C:/msys64/usr/bin/merge.exe. Итак, пора попробовать STEP1 ~ STEP3.

STEP 1
Я могу заставить его работать в native Windows терминале , если я добавлю C:/msys64/usr/bin/ в переменную PATH env:

C:/Users/Kristof>merge.exe a.txt b.txt c.txt

ура!

ШАГ 2
К сожалению, go работает неправильно, когда я не изменяю PATH env и вызовите merge.exe по ее полному пути:

C:/Users/Kristof>"C:/msys64/usr/bin/merge.exe" a.txt b.txt c.txt
/usr/bin/diff3: subsidiary program 'diff' not found

Я не понимаю, почему появляется эта ошибка. В конце концов, исполняемые файлы diff3.exe и diff.exe находятся рядом с merge.exe. Почему их нельзя найти?

ШАГ 3
Ну, ШАГ 3, очевидно, бесполезен, если я не могу сначала заставить предыдущий шаг работать.

3. Другие испытания

3.1 Бинарные файлы Purdue

Вы можете найти бинарные файлы для RCS здесь: https://www.cs.purdue.edu/homes/trinkle/RCShome/

Я скачал rcs57pc1.zip (1,2 МБ) с этого веб-сайта. К сожалению, каждая попытка запустить merge.exe терпит неудачу со следующим сообщением об ошибке:

diff3.exe: subsidiary program failed

Я пробовал решения, предлагаемые в этом сообщении StackOverflow, но они тоже не работают:

RCS на Windows - rcsmerge всегда не работает


3.2 ezwinports

Я скачал rcs-5.7-1.zip от: https://sourceforge.net/projects/ezwinports/files/

При запуске его файла merge.exe я получаю следующую ошибку:

diff3.exe: Unknown signal 0xEEEEEEEE
merge aborted

Действительно, я не видел diff3.exe в распакованной папке. Поэтому я скопировал diff3.exe и diff.exe из моей установки MSYS (находится по адресу C:/msys64/usr/bin/) в распакованную папку rcs-5.7-1. Безуспешно. То же сообщение об ошибке.


3.3 GnuWin32

Проект GnuWin32 известен своими многочисленными преобразованиями популярных инструментов с Linux в Windows. Я загрузил GnuWin32 (http://gnuwin32.sourceforge.net/) и выполнил полную установку в C:/gnuwin32/. Я просмотрел свою папку C:/gnuwin32/, но нигде не нашел инструмента merge.exe. Это очень странно, потому что проект GNU RCS здесь явно упоминается как пакет из проекта GnuWin32:

http://gnuwin32.sourceforge.net/packages/rcs.htm

1 Ответ

0 голосов
/ 07 августа 2020

Решение использует diff3.exe напрямую вместо merge.exe:

enter image description here

You can put diff3.exe in any arbitrary directory, as long as you don't forget to copy these dll's:

  • msys-2.0.dll
  • msys-iconv-2.dll
  • msys-intl-8.dll

This is how to use the executable:

>diff3 -m myfile.txt ancestor.txt yourfile.txt

К сожалению, по-прежнему необходимо добавить папку в PATH переменная env. Однако фактическая цель использования заключалась в том, чтобы вызвать исполняемый файл из Python, поэтому это можно сделать следующим образом:

my_env = os.environ.copy()
my_env["PATH"] = "C:/merge/windows/;" + my_env["PATH"]
proc = subprocess.Popen(
    [
        merge_tool,
        "-m",
        myfile_path,
        ancestor_path,
        yourfile_path,
    ],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    env=my_env,
)

try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()
    return None
return outs.decode('utf-8').replace('\r\n', '\n')
...