Я использую инструмент nrfutil
, который реализован на Python. Чтобы использовать его под NixOS, я использовал файл default.nix
, который устанавливал nrfutil в venv. Некоторое время это работало очень хорошо. (Последняя сборка на сервере сборки, использующая Nix в альпийском контейнере, может успешно собрать программное обеспечение, над которым я работаю 11 дней назад.) Когда я делаю то же самое (т.е. перезапускаю сборку сервера CI без изменений), сборка завершается неудачно. теперь жалуюсь на неправильность pip
:
$ nix-shell
New python executable in /home/matthias/source/tbconnect/bootloader/.venv/bin/python2.7
Not overwriting existing python script /home/matthias/source/tbconnect/bootloader/.venv/bin/python (you must use /home/matthias/source/tbconnect/bootloader/.venv/bin/python2.7)
Installing pip, wheel...
done.
Traceback (most recent call last):
File "/home/matthias/source/tbconnect/bootloader/.venv/bin/pip", line 6, in <module>
from pip._internal.main import main
ImportError: No module named main
Мне кажется, что модуль main
должен существовать:
$ ls -l .venv/lib/python2.7/site-packages/pip/_internal/main.py
-rw-r--r-- 1 matthias matthias 1359 10月 15 12:27 .venv/lib/python2.7/site-packages/pip/_internal/main.py
Я не очень вхожу в среду Pythonтак что я не знаю дальше. Есть ли у меня указатель, где продолжить отладку? Как Python разрешает модули? Почему он не находит модуль, который мне кажется?
Это мой default.nix
, который я использую для установки pip
:
with import <nixpkgs> {};
with pkgs.python27Packages;
stdenv.mkDerivation {
name = "impurePythonEnv";
buildInputs = [
automake
autoconf
gcc-arm-embedded-7
# these packages are required for virtualenv and pip to work:
#
python27Full
python27Packages.virtualenv
python27Packages.pip
# the following packages are related to the dependencies of your python
# project.
# In this particular example the python modules listed in the
# requirements.txt require the following packages to be installed locally
# in order to compile any binary extensions they may require.
#
taglib
openssl
git
stdenv
zlib ];
src = null;
shellHook = ''
# set SOURCE_DATE_EPOCH so that we can use python wheels
SOURCE_DATE_EPOCH=$(date +%s)
virtualenv --no-setuptools .venv
export PATH=$PWD/.venv/bin:$PATH
#pip install nrfutil
pip help
# the following is required to build micro_ecc_lib_nrf52.a in the SDK
export GNU_INSTALL_ROOT="${gcc-arm-embedded-7}/bin/"
unset CC
'';
}
- Я заменил
pip install nrfutil
на pip help
, чтобы убедиться, что проблема не в пакете, который я пытаюсь установить сам. - Я все еще использую Python 2.7, так как
nrfutil
все еще не подходит для Python 3. - В любом случае замена
python27
на python37
не изменила ошибку, которую я получаю при попытке запустить pip
.) - Локальная версия NixOS, используемая 19.09. Nix в контейнере док-станции CI -
nixos/nix:latest
, который является менеджером пакетов nix в Alpine Linux.
Обновление:
На самом деле это работает, когда я заменяюпозвоните на pip install nrfutil
с python2.7 -m pip install nrfutil
. Это на самом деле смущает меня еще больше. Python2.7 - это именно тот двоичный файл, который находится в заголовке pip:
[nix-shell:~/source/tbconnect/bootloader]$ type python2.7
python2.7 is /home/matthias/source/tbconnect/bootloader/.venv/bin/python2.7
[nix-shell:~/source/tbconnect/bootloader]$ type pip
pip is /home/matthias/source/tbconnect/bootloader/.venv/bin/pip
[nix-shell:~/source/tbconnect/bootloader]$ head --lines 2 .venv/bin/pip
#!/home/matthias/source/tbconnect/bootloader/.venv/bin/python2.7
# -*- coding: utf-8 -*-
Обновление 2: Я обнаружил, что еще один способ решить эту проблему - отредактировать .venv/bin/pip
. Этот скрипт пытался выполнить следующий импорт:
from pip._internal.main import main
Я думаю, что это новый путь к модулю, начинающийся с пипа 19.3. Но у меня все еще есть пункт 19.2. Когда я изменяю эту строку на:
from pip._internal import main
Запуск pip
с помощью ввода pip
работает.
Дело в том, что я понятия не имею, почему скрипт pip
пытаетсязагрузить новый путь к модулю, в то время как NixOS все еще имеет старую версию pip
.
. Я также открыл проблему для NixOS на GitHub: https://github.com/NixOS/nixpkgs/issues/71178