Python distutils не использует правильную версию gcc - PullRequest
6 голосов
/ 11 мая 2011

Я пытаюсь скомпилировать пакет на Mac OSX 10.6.5.Скрипт установки пакета основан на distutils.Проблема в том, что gcc по умолчанию для компьютера - это версия 4.2 (я определил это, просто запустив gcc --version в окне терминала), но когда я запускаю 'python setup.py build', я вижу из вывода, что distutils выбирает gcc-4.0 вместо 4.2 Это большая проблема, потому что код, который я использую, требует gcc> = 4.2.У меня нет прав администратора на этом компьютере, поэтому в качестве workaroud я создал несколько символических ссылок, которые отправляют gcc-4.0 на gcc-4.2.В результате код компилируется, но сгенерированные файлы .so не работают (когда я пытаюсь импортировать их в python, я получаю сообщения об отсутствии функции init в общем объекте).

Я попытался скомпилировать этот код на другом Mac (10.6.6), и он работает как чудо: distutils выбирает 4.2 без принуждения, и я могу без проблем импортировать сгенерированный общий объект.Итак, что я хотел бы сделать, это скомпилировать код на моем компьютере, не выполняя эту хитрость с символическими ссылками ... Я просто хочу, чтобы distutils выбирал 4.2 автоматически, как и должно.Я попытался взять файлы .so, которые правильно компилируются, и перенести их на мой компьютер, но это не помогло по ряду причин (они связаны с библиотеками, которых нет на моем компьютере / версии которых отличаются от установленных).

У кого-нибудь есть здесь советы?

Спасибо, Джош

Ответы [ 4 ]

16 голосов
/ 11 мая 2011

Чтобы заставить distutils использовать отдельный компилятор, вы можете переопределить несколько переменных через окружение. Сначала выясните, что distutils использует по умолчанию:

>>> from distutils import sysconfig
>>> sysconfig.get_config_var('LDSHARED')
'gcc-4.0 -Wl,-F. -bundle -undefined dynamic_lookup'
>>> sysconfig.get_config_var('CC')
'gcc-4.0'

Далее вам нужно переопределить их, заменив версию gcc, которую вы хотите использовать:

% LDSHARED="gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup" CC=gcc-4.2 \
    /usr/bin/python setup.py build_ext

Имейте в виду, что значения по умолчанию для sysconfig извлекаются из Make-файла, который изначально использовался для компиляции python, поэтому фальсификация с ними может привести к непредвиденным результатам:

>>> path = sysconfig.get_python_lib(plat_specific=1, standard_lib=1)
>>> os.path.join(path, 'config', 'Makefile')
'/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/config/Makefile'
4 голосов
/ 10 октября 2011

Вы пытались установить пользовательскую переменную среды CC?

CC=gcc-4.2 python setup.py build
3 голосов
/ 11 мая 2011

Вы не говорите, какие версии Python вы используете, но есть вероятность, что Python по умолчанию на компьютере, который вы используете, не является поставляемым Apple Python 2.6.1, более вероятно, установленным с python.org.Попробуйте запустить скрипт сборки с /usr/bin/python2.6, который должен быть Python 2.6 от Apple;который использует gcc-4.2.

Когда вы используете Distutils Python (обычно с помощью скрипта setup.py или easy_install), Distutils пытается убедиться, что все модули расширения C в устанавливаемом пакетебудет скомпилирован с той же версией компилятора и с совместимыми опциями компиляции (CPU Archs, ABI и т. д.), которые использовались для сборки самого Python.Традиционно, большинство установщиков python.org для OS X предоставляют универсальный Python, который работает на нескольких версиях OS X и на нескольких архитектурах процессора.Вот почему они построены с gcc-4.0.Если вам нужно использовать gcc-4.2 для какой-то другой библиотеки, тогда самым безопасным является использование Python, созданного с помощью gcc-4.2.Поставляемая Apple система Pythons на OS X 10.6 построена именно так.Кроме того, для самых последних выпусков Python (2.7.1 и 3.2) python.org предоставляет второй вариант установщика OS X для OS X 10.6, который также собран с gcc-4.2.Но если у вас нет доступа администратора к вашему компьютеру, это не вариант в любом случае.

Вы можете увидеть, какой питон используется по умолчанию:

which python
1 голос
/ 11 мая 2011

Вы можете либо настроить свой distutils.cfg (см. здесь ), либо передать аргументы командной строки как --compiler = gcc42 (не уверен насчет последнего).

...