cython MinGW ошибка в cygwincompiler ld_version равен None
Много подобных вопросов уже задавалось, например:
Но мою проблему они не решили
Проблема такая:
Пытаюсь скомпилировать 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
Что можно сделать?