A criação de pacotes Python é bem-sucedida, mas o pacote é construído incorretamente

3

Ao executar python3 setup.py build , ele terminou com isso:

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

É claro que não foi possível gravar em /usr/local/lib/ , já que não foi usado sudo . Tenho receio de usar o sudo para este passo.

Este foi o fim de 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

Parece bom para mim. No entanto, quando tento import sklearn , recebo este erro:

$ 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.
>>>

Devo rodar python3 setup.py build com sudo ? Isso está no 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

Note que a versão do python-scikits-learn em pacote do Ubuntu é somente para o Python 2, e eu preciso do Python 3.

    
por dotancohen 02.11.2015 / 11:38

3 respostas

3

Eu encontrei este post que mencionou para configurar qual versão do ATLAS (pacote de álgebra linear) usar:

$ 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

Depois disso, fiquei feliz em saber que, de fato, não havia mais um problema de permissões, mas estava recebendo esse erro na compilação:

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

Por isso, analisei os resultados de aptitude search python | grep dev e decidi que os seguintes pacotes podem ajudar:

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

E com isso o pacote foi criado corretamente e o scikit-learn é importado corretamente:

$ 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
>>>

Não sei qual dos três pacotes foi o pacote crítico, provavelmente libpython3.4-dev , mas o problema está resolvido.

    
por 02.11.2015 / 13:02
1

Você deve limpar (remover) sua instalação local e executar sudo apt-get install python-scikits-learn . Ele é empacotado para o debian, então também será empacotado para o Ubuntu e derivados.

As instruções de instalação das bibliotecas python geralmente informam você para instalar as coisas manualmente. Isso é um erro se a biblioteca já foi empacotada para sua distro - o pacote distro será muito melhor integrado ao sistema do que seguir algumas instruções de instalação em um site.

A primeira coisa que você deve fazer quando deseja instalar uma biblioteca python é usar ferramentas como apt-cache search ou aptitude search para descobrir se ela já está empacotada. Se estiver, instale o pacote. Se não for, provavelmente será melhor usar as ferramentas deb-dry ou debhelper para ajudá-lo a criar um pacote local a seguir instruções que provavelmente funcionam apenas no próprio ambiente idiossincrático do desenvolvedor lib.

    
por 02.11.2015 / 12:13
0

Para resolver o problema, você deve continuar a instalação - e isso significa executar a compilação novamente, mas com sudo neste momento. A razão pela qual você não pode instalar sem o sudo é como o processo de instalação do software se parece (na maior parte do tempo).

  1. Etapa de configuração - você prepara arquivos para criar o programa. Isso não deve precisar de privilégios de root.
  2. Etapa de compilação - você compila seu programa, gerando alguns executáveis e / ou bibliotecas. Isso não deve exigir privilégios de root.
  3. Instalação - você move bibliotecas e / ou executáveis para seu destino no SO, para que outros programas possam usá-lo.

O Build cria /usr/local/lib/python3.4/dist-packages/sklearn para que outros programas possam usá-lo (por exemplo, interpretador python) e é por isso que você está recebendo um erro.

    
por 02.11.2015 / 13:06