cython MinGW ошибка в cygwincompiler ld_version равен None

Много подобных вопросов уже задавалось, например:

Вопрос 1.

Вопрос 2.

Но мою проблему они не решили

Проблема такая:

Пытаюсь скомпилировать Cython-расширение с помощью gcc, предоставляемого MinGW, все установлено с помощью mingw-get

В переменных окружения прописано C:\MinGW\bin в PATH

Создал в %Python%\Lib\distutils файл distutils.cfg:

[build]           
compiler=mingw32

[build_ext]           
compiler=mingw32 

Запускаю

python setup.py build_ext --inplace

Выдает ошибку, описанную в вопросе 1, решение не помогло

Полез в %Python%\Lib\distutils\cygwincompiler.py, разбираться, почему ld_version имеет значение None

В итоге нашел проблему с выполнением команды ld -v с помощью subprocess.Popen

Версия ld достается с помощью такой функции:

def get_versions():
    """ Try to find out the versions of gcc, ld and dllwrap.

    If not possible it returns None for it.
    """
    commands = ['gcc -dumpversion', 'ld -v', 'dllwrap --version']
    return tuple([_find_exe_version(cmd) for cmd in commands])

Ну и соответственно полез в _find_exe_version(cmd)

В этой функции выполняется команда примерно таким образом:

from subprocess import Popen
"""
Выполняем команду и читаем stdout, здесь команду захардкожу как 'ld -v'
"""
cmd = 'ld -v'
out = Popen(cmd, shell=True, stdout=PIPE).stdout
try:
    out_string = out.read() # Здесь должен быть результат
finally:
    out.close()

Однако протестив данный код, получаю, что переменная out_string пустая, а именно

out_string = b'' (То есть это ветка try отработала без ошибок)

Плюс ко всему, когда выполняется Popen для ld -v в консоль печатается такой результат результат

���⥬� �� 㤠���� ���� 㪠����� ����.
LD64 port (v274.2) [Jul 10 2019:10:55:27] configured to support archs: i386 x86_64 x86_64h armv6 armv7 armv7s armv7m arm64
LTO support using: (lto not included)

Хотя, когда я вызываю это в обычном PowerShell проблем с кодировкой нет

Попробовал сделать проверить stderr - все байты оказались там

out = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE).stderr
out.read() # b'\x91\xa8\xe1\xe2\xa5\xac\xa5 \xad\xa5...'

В итоге починил это дело с помощью

proc = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE)
out, err = proc.stdout, proc.stderr
try:
    out_string = out.read()
    if out_string == b'':
        out_string = err.read()
finally:
    out.close()

Но все-же странно, что сообщение выдается в stderr

Что можно сделать?


Ответы (0 шт):