Я хочу создать виртуальную среду с некоторыми пакетами 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.
да. однако вопрос более общий. могу ли я определить флаги c-компилятора с помощью команды pip?
Конечно, вы можете передать флаги компилятора в установку, обычный CFLAGS = "-foo" CPPFLAGS = "-bar" LDFLAGS = "baz" pip install qux
и т. д., Но для меня похоже, что ваша проблема в том, что у вас уже есть установленный и скомпилированный материал, и вы пытаетесь вызвать скомпилированный материал с другой машины с несовместимой средой выполнения, или я вас неправильно понял?
Также не забывайте, что virtualenv не является изолированной переносимой установкой Python. Это просто прокладка, и она по-прежнему во многом зависит от того, что есть в базовой установке. Может, лучшим решением было бы исправить создание venv на машине с песчаным мостом? Если хочешь, я могу помочь в этом.
Или, может быть, разумно скомпилировать другой дистрибутив Python из исходников, если у вас нет root-доступа на машине с Sandy Bridge и т. д.
небольшое недоразумение: правда Я что-то установил и скомпилировал, но переделать это не проблема. Я хочу установить и скомпилировать на haswell что-нибудь, что может работать и на sandy. Поскольку у меня есть интерпретатор Python, который работает так, как я хочу, может ли решение быть CFLAGS=`/usr/bin/python2.7-config --cflags` pip install numpy
? (У меня здесь терминала нет)
CFLAGS=$(/usr/bin/python2.7-config --cflags)
не должен действовать, поскольку эти флаги применяются по умолчанию. Однако флаги компиляции применяются только в том случае, если вы действительно компилируете numpy
из исходного кода; чтобы обеспечить это, вы должны добавить --no-binary=numpy
в команду установки. Кроме того, увеличьте уровень детализации с помощью -vvv
, чтобы увидеть подробности компиляции. Таким образом, полная команда будет чем-то вроде CFLAGS = "-O1" pip install numpy -vvv --no-binary=numpy
. Вы должны увидеть, какие флаги применяются компилятором C и компоновщиком к каждому расширению C, встроенному в пакет.
Большое спасибо за преданность @hofling. если я не использую --no-binary=numpy
, как pip решает, какой двоичный файл использовать? Я не нашел в Интернете руководства, объясняющего, как работает pip (install) (многие объясняют, как его использовать), поэтому, если вы также укажете мне документацию, которая делает это, или другой вопрос здесь, SO, я был бы очень благодарен. это [the-hitchhikers-guide-to-packaging.readthedocs.io/en/latest /… звучит как длинный обходной путь, но я думаю, что если я узнаю, как упаковать какой-то код, я также отвечу на свой вопрос.
Если вы запускаете pip install numpy
, pip
запрашивает текущую арку платформы, версию интерпретатора python и ABI и просматривает список доступных индексов в поисках двоичного колеса с именем, соответствующим запрашиваемым данным. Он не ищет конкретные параметры компилятора; будет установлен первый, соответствующий версии Python и арке платформы. Если колесо не найдено, pip
ищет исходный dist и затем компилирует пакет из исходного кода.
В общем, вы пытаетесь использовать виртуальную среду, созданную на машине A, на машине B?