Сборка пакетов Python прошла успешно, но пакет собран неправильно

Сборка пакетов Python прошла успешно, но пакет собран неправильно

При запуске python3 setup.py buildон закончился следующим образом:

x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.4/sklearn/linear_model/sag_fast.o -Lbuild/temp.linux-x86_64-3.4 -o build/lib.linux-x86_64-3.4/sklearn/linear_model/sag_fast.cpython-34m.so
running install_lib
creating /usr/local/lib/python3.4/dist-packages/sklearn
error: could not create '/usr/local/lib/python3.4/dist-packages/sklearn': Permission denied

Конечно, он не мог писать, /usr/local/lib/так как не sudoбыло использовано no. Я опасаюсь использовать sudo для этого шага.

Это был конец sudo python3 setup.py install:

running install_egg_info
Writing /usr/local/lib/python3.4/dist-packages/scikit_learn-0.18.dev0.egg-info
running install_clib

Мне кажется, это хорошо. Однако, когда я пытаюсь, import sklearnя получаю эту ошибку:

$ python3
Python 3.4.3+ (default, Oct 14 2015, 16:03:50) 
[GCC 5.2.1 20151010] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sklearn
Traceback (most recent call last):
File "/home/dotancohen/code/scikit-learn/sklearn/__check_build/__init__.py", line 44, in <module>
    from ._check_build import check_build
ImportError: No module named 'sklearn.__check_build._check_build'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/dotancohen/code/scikit-learn/sklearn/__init__.py", line 56, in <module>
    from . import __check_build
File "/home/dotancohen/code/scikit-learn/sklearn/__check_build/__init__.py", line 46, in <module>
    raise_build_error(e)
File "/home/dotancohen/code/scikit-learn/sklearn/__check_build/__init__.py", line 41, in raise_build_error
    %s""" % (e, local_dir, ''.join(dir_content).strip(), msg))
ImportError: No module named 'sklearn.__check_build._check_build'
___________________________________________________________________________
Contents of /home/dotancohen/code/scikit-learn/sklearn/__check_build:
_check_build.c            setup.pyc                 __pycache__
_check_build.pyx          __init__.py               setup.py
___________________________________________________________________________
It seems that scikit-learn has not been built correctly.

If you have installed scikit-learn from source, please do not forget
to build the package before using it: run `python setup.py install` or
`make` in the source directory.

If you have used an installer, please check that it is suited for your
Python version, your operating system and your platform.
>>>

Стоит ли мне бежать python3 setup.py buildс sudo?Это на Kubuntu Linux 15.10:

$ uname -a
Linux loathe 4.2.0-16-generic #19-Ubuntu SMP Thu Oct 8 15:35:06 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/issue
Ubuntu 15.10 \n \l

Обратите внимание, что версия Ubuntu предназначена python-scikits-learnтолько для Python 2, а мне нужен Python 3.

решение1

я нашелэта почтав котором упоминается, как настроить, какую версию ATLAS (пакет линейной алгебры) использовать:

$ sudo update-alternatives --set libblas.so.3 /usr/lib/atlas-base/atlas/libblas.so.3
$ sudo update-alternatives --set liblapack.so.3 /usr/lib/atlas-base/atlas/liblapack.so.3

После этого я был приятно удивлен, что на самом деле проблемы с правами доступа больше не было, но вместо этого при сборке я получал следующую ошибку:

sklearn/__check_build/_check_build.c:4:20: fatal error: Python.h: No such file or directory

Поэтому я проанализировал результаты aptitude search python | grep devи решил, что следующие пакеты могут помочь:

$ sudo aptitude install python3-numpy-dev python3.5-dev libpython3.4-dev

И после этого пакет будет собран правильно, а scikit-learn импортируется правильно:

$ python3
Python 3.4.3+ (default, Oct 14 2015, 16:03:50) 
[GCC 5.2.1 20151010] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sklearn
>>>

Я не уверен, какой из трех пакетов был критическим, возможно libpython3.4-dev, но проблема решена.

решение2

Вам следует очистить (удалить) вашу локальную установку и запустить sudo apt-get install python-scikits-learn. Он упакован для Debian, поэтому также будет упакован для Ubuntu и производных.

Инструкции по установке библиотек Python часто говорят вам, что нужно устанавливать все вручную. Это ошибка, если библиотека уже упакована для вашего дистрибутива — пакет дистрибутива будет гораздо лучше интегрирован в систему, чем следование некоторым инструкциям по установке на веб-сайте.

Первое, что вам следует сделать, когда вы хотите установить библиотеку Python, это использовать такие инструменты, как apt-cache searchили , aptitude searchчтобы выяснить, упакована ли она уже. Если да, установите пакет. Если нет, вам, вероятно, лучше использовать deb-dryили debhelperинструменты, которые помогут вам собрать локальный пакет, чем следовать инструкциям, которые, вероятно, работают только в собственной идиосинкразической среде разработчика библиотеки.

решение3

Чтобы решить проблему, вам следует продолжить установку - и это будет означать повторный запуск сборки, но с sudoэтим временем. Причина, по которой вы не смогли установить без sudo, заключается в том, как выглядит процесс установки программного обеспечения (большую часть времени).

  1. Шаг конфигурации - вы готовите файлы для сборки программы. Для этого не нужны привилегии root.
  2. Этап сборки — вы компилируете свою программу, получая некоторые исполняемые файлы и/или библиотеки. Это не должно требовать привилегий root.
  3. Установка — вы перемещаете библиотеки и/или исполняемые файлы в место назначения в ОС, чтобы другие программы могли их использовать.

Сборка создается /usr/local/lib/python3.4/dist-packages/sklearnдля того, чтобы другие программы могли ее использовать (например, интерпретатор Python), и именно поэтому вы получаете ошибку.

Связанный контент