Установите флаги C-компилятора, которые будут использоваться установщиком pip

Я хочу создать виртуальную среду с некоторыми пакетами python в кластере, где доступны разные процессоры Intel (например, Sandy Bridge Старый и haswell новый). Узел входа в систему, откуда должна произойти установка, - haswell.

Так что я:

pip install virtualenv
cd my_project_folder
virtualenv my_project

Если мне это нравится, когда я вхожу в систему на песчаном мосту и запускаю python, я получаю:

Please verify that both the operating system and the processor support Intel(R) MOVBE, F16C, FMA, BMI, LZCNT and AVX2 instructions.

потому что исполняемый файл python был создан с флагами компилятора, которые работают только для узлов haswell. Я могу сказать virtualenv, какой исполняемый файл Python я хочу использовать:

virtualenv -p /usr/bin/python2.7 my_project

но потом, когда я

pip install numpy

он находит и берет его скомпилированную haswell версию, которая больше не будет работать на арке песчаного моста.

Как я могу указать pip не использовать пакеты, скомпилированные с флагами haswell?

По некоторым причинам я мог бы объяснить, что не могу создать virtenv, используя процессор Sandy-Bridge.

В общем, вы пытаетесь использовать виртуальную среду, созданную на машине A, на машине B?

hoefling 27.10.2018 14:36

да. однако вопрос более общий. могу ли я определить флаги c-компилятора с помощью команды pip?

fabiob 30.10.2018 17:22

Конечно, вы можете передать флаги компилятора в установку, обычный CFLAGS = "-foo" CPPFLAGS = "-bar" LDFLAGS = "baz" pip install qux и т. д., Но для меня похоже, что ваша проблема в том, что у вас уже есть установленный и скомпилированный материал, и вы пытаетесь вызвать скомпилированный материал с другой машины с несовместимой средой выполнения, или я вас неправильно понял?

hoefling 30.10.2018 18:32

Также не забывайте, что virtualenv не является изолированной переносимой установкой Python. Это просто прокладка, и она по-прежнему во многом зависит от того, что есть в базовой установке. Может, лучшим решением было бы исправить создание venv на машине с песчаным мостом? Если хочешь, я могу помочь в этом.

hoefling 30.10.2018 18:35

Или, может быть, разумно скомпилировать другой дистрибутив Python из исходников, если у вас нет root-доступа на машине с Sandy Bridge и т. д.

hoefling 30.10.2018 18:36

небольшое недоразумение: правда Я что-то установил и скомпилировал, но переделать это не проблема. Я хочу установить и скомпилировать на haswell что-нибудь, что может работать и на sandy. Поскольку у меня есть интерпретатор Python, который работает так, как я хочу, может ли решение быть CFLAGS=`/usr/bin/python2.7-config --cflags` pip install numpy? (У меня здесь терминала нет)

fabiob 31.10.2018 18:32
CFLAGS=$(/usr/bin/python2.7-config --cflags) не должен действовать, поскольку эти флаги применяются по умолчанию. Однако флаги компиляции применяются только в том случае, если вы действительно компилируете numpy из исходного кода; чтобы обеспечить это, вы должны добавить --no-binary=numpy в команду установки. Кроме того, увеличьте уровень детализации с помощью -vvv, чтобы увидеть подробности компиляции. Таким образом, полная команда будет чем-то вроде CFLAGS = "-O1" pip install numpy -vvv --no-binary=numpy. Вы должны увидеть, какие флаги применяются компилятором C и компоновщиком к каждому расширению C, встроенному в пакет.
hoefling 31.10.2018 19:11

Большое спасибо за преданность @hofling. если я не использую --no-binary=numpy, как pip решает, какой двоичный файл использовать? Я не нашел в Интернете руководства, объясняющего, как работает pip (install) (многие объясняют, как его использовать), поэтому, если вы также укажете мне документацию, которая делает это, или другой вопрос здесь, SO, я был бы очень благодарен. это [the-hitchhikers-guide-to-packaging.readthedocs.io/en/latest‌ /… звучит как длинный обходной путь, но я думаю, что если я узнаю, как упаковать какой-то код, я также отвечу на свой вопрос.

fabiob 31.10.2018 19:48

Если вы запускаете pip install numpy, pip запрашивает текущую арку платформы, версию интерпретатора python и ABI и просматривает список доступных индексов в поисках двоичного колеса с именем, соответствующим запрашиваемым данным. Он не ищет конкретные параметры компилятора; будет установлен первый, соответствующий версии Python и арке платформы. Если колесо не найдено, pip ищет исходный dist и затем компилирует пакет из исходного кода.

hoefling 31.10.2018 21:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
9
4 256
0

Другие вопросы по теме