Больше не могу использовать pip в NixOS - PullRequest
0 голосов
/ 15 октября 2019

Я использую инструмент 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

1 Ответ

0 голосов
/ 04 ноября 2019

Я заставил вашу деривацию оболочки работать, сбросив Python27Packages.pip,

(nix-shell) 2d [azul:/tmp/lixo12333] $ 
 >>> pip list
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
Package          Version
---------------- -------
behave           1.2.6  
Click            7.0    
crcmod           1.7    
ecdsa            0.13.3 
enum34           1.1.6  
future           0.18.2 
intelhex         2.2.1  
ipaddress        1.0.23 
libusb1          1.7.1  
linecache2       1.0.0  
nrfutil          5.2.0  
parse            1.12.1 
parse-type       0.5.2  
pc-ble-driver-py 0.11.4 
piccata          1.0.1  
pip              19.3.1 
protobuf         3.10.0 
pyserial         3.4    
pyspinel         1.0.0a3
PyYAML           4.2b4  
setuptools       41.6.0 
six              1.12.0 
tqdm             4.37.0 
traceback2       1.4.0  
virtualenv       16.4.3 
wheel            0.33.6 
wrapt            1.11.2 
(nix-shell) 2d [azul:/tmp/lixo12333] $ 

и мой default.nix

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
    # 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 .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
  '';
}
...