Devemos deixar o pip do Python sobrescrever os módulos que foram instalados pelo RPM?

1

O Python pip e muitos módulos Python são fornecidos por meio dos repositórios do CentOS Linux. No CentOS 7.x Linux, posso instalar pip e pymongo com o gerenciador de pacotes de distribuição padrão ( yum install python-pip python-pymongo ).

No entanto, a versão de pymongo que está disponível no repositório já é muito antiga. A versão de pip também está atrasada, por isso recomenda imediatamente a execução de pip install --upgrade pip .

Existe um consenso sobre o que se deve fazer aqui? Usar pip para executar as atualizações substituirá os arquivos que vieram dos RPMs, portanto, é provável que você receba reclamações sobre isso no gerenciador de pacotes.

É melhor não instalar pip e os módulos do RPM? Talvez apenas instalar o Python a partir do RPM e, em seguida, instalar todos os módulos do pip (para que nenhum dos módulos do Python sejam do RPM e sejam totalmente gerenciados pelo pip )?

    
por i_grok 23.04.2016 / 01:45

5 respostas

1

Dê uma olhada nesta questão. Ele fala sobre ter o pip instalado em um diretório diferente. Isso permitiria manter as instalações do rpm e ter a versão mais recente. Eu provavelmente iria desinstalar a versão rpm se você não planeja usá-lo.

link

    
por 23.04.2016 / 01:52
2

O CentOS 7.x é derivado do Red Hat Enterprise 7.x, projetado para ser estável . Isso significa inevitavelmente que os programas que estão disponíveis nos repositórios foram testados por um tempo. Você pode ver isso na descrição em seu site:

The CentOS Project is a community-driven free software effort focused on delivering a robust open source ecosystem. For users, we offer a consistent manageable platform that suits a wide variety of deployments. For open source communities, we offer a solid, predictable base to build upon, along with extensive resources to build, test, release, and maintain their code.

Se você quer um código "de ponta", você pode usar o Fedora . O Fedora tem objetivos diferentes:

The Fedora Project is a global partnership of free software community members. The Fedora Project is sponsored by Red Hat, which invests in our infrastructure and resources to encourage collaboration and incubate innovative new technologies. Some of these technologies may later be integrated into Red Hat products. They are developed in Fedora and produced under a free and open source license from inception, so other free software communities and projects are free to study, adopt, and modify them.

Existem tradeoffs, mas você não pode ter "stable" e "new" ao mesmo tempo.

    
por 23.04.2016 / 01:48
2

Is it better not to install pip and the modules from RPM? Perhaps just installing Python from RPM and then installing all modules from pip (so that none of the Python modules are from RPM and are wholly managed by pip)?

É 'ok' instalar o pip e outros módulos Python do gerenciador de pacotes do seu sistema operacional. Você pode não ter mais escolha sobre isso, pois muitos componentes do sistema dependem do Python e, mesmo em uma versão de instalação mínima do sistema operacional, você encontrará os módulos Python + Python instalados como padrão.

Portanto, sempre que você achar que precisa atualizar a versão 'system-wide' do pip ou qualquer um dos módulos do Python, mas não quer interferir nos arquivos gerenciados pelo gerenciador de pacotes, faça o seguinte:

As instruções a seguir são para um sistema operacional derivado do RHEL e a versão do Python disponível na época era 2.7.x. Você precisará ajustar o PYTHONPATH para corresponder à sua versão instalada do Python.

  • Verifique se a versão do gerenciador de pacotes do python-pip está instalada. por exemplo. yum -y install python-pip .

  • Crie um script profile.d para configurar a variável de ambiente PYTHONPATH:

    # Ensure PYTHONPATH is configured to use /usr/local/lib*/python2.7/site-packages
    read -r -d '' pythonpath_profile_script <<'EOF'
    pythonpathmunge () {
        case ":${PYTHONPATH}:" in
            *:"$1":*)
                ;;
            *)
                if [ "$2" = "after" ] ; then
                    PYTHONPATH=$PYTHONPATH:$1
                else
                    PYTHONPATH=$1:$PYTHONPATH
                fi
        esac
    }
    
    pythonpathmunge /usr/local/lib/python2.7/site-packages
    pythonpathmunge /usr/local/lib64/python2.7/site-packages
    export PYTHONPATH
    EOF
    
    echo "Creating the /etc/profile.d/pythonpath.sh profile script:"
    echo "${pythonpath_profile_script}" > /etc/profile.d/pythonpath.sh
    chown root.root /etc/profile.d/pythonpath.sh
    chmod -v 0644 /etc/profile.d/pythonpath.sh
    source /etc/profile.d/pythonpath.sh
    hash -r
    
  • Você pode então escolher instalar a última versão do pip ou qualquer outro módulo python via:

    pip install --upgrade <<PYTHON MODULE NAME>> --ignore-installed --install-option="--prefix=/usr/local" --log /var/log/<<PYTHON MODULE NAME>>-install-$(date "+%Y%m%d%H%M%S").log
    

    por exemplo,

    pip install --upgrade pip --ignore-installed --install-option="--prefix=/usr/local" --log /var/log/pip-install-$(date "+%Y%m%d%H%M%S").log
    hash -r
    # Notice the use of 'hash -r' to refresh bash's hash table of recently
    # executable programs. Without doing this you may find that the 'pip'
    # command being used is not the version you just installed.
    

Isso instalará o módulo Python solicitado em /usr/local , onde não interferirá nos arquivos gerenciados pelo gerenciador de pacotes do sistema. A opção --ignore-installed garante que o pip não toque na versão existente do módulo. Além disso, devido ao uso da variável de ambiente PYTHONPATH, os caminhos /usr/local/lib*/python2.7/site-packages serão usados antes de qualquer pacote instalado pelo sistema. ou seja,

[root@localhost ~]# python
Python 2.7.5 (default, Sep 15 2016, 22:37:39)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print '\n'.join(sys.path)

/usr/local/lib64/python2.7/site-packages        <---
/usr/local/lib/python2.7/site-packages          <---
/root
/usr/lib64/python27.zip
/usr/lib64/python2.7
/usr/lib64/python2.7/plat-linux2
/usr/lib64/python2.7/lib-tk
/usr/lib64/python2.7/lib-old
/usr/lib64/python2.7/lib-dynload
/usr/lib64/python2.7/site-packages
/usr/lib/python2.7/site-packages
>>>

Por fim, pelo menos no CentOS / RHEL, o caminho /usr/local/bin é anterior a qualquer outro caminho binário do sistema na variável de ambiente PATH e, portanto, isso também garante que quaisquer binários mais recentes instalados em / usr / local / bin tenham precedência acima do sistema instalado. ou seja,

[root@localhost ~]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    
por 28.10.2016 / 16:38
1

Se você quiser usar o Python apenas para si mesmo sem estragar o python do seu sistema, dê uma olhada em um produto chamado Anaconda da Continuum. link esta instalação do python etc ... irá instalar no seu diretório home e alterar os caminhos para que você não esteja instalando para o seu sistema python e, possivelmente, bagunçando o seu sistema. Você também pode criar ambientes virtuais e os ambientes Conda dessas opções permitem que você experimente algo e, se você não gostar, apenas jogue fora o ambiente.

    
por 25.04.2016 / 02:31
0

Is there a consensus on what one should do here?

Sim, não modifique manualmente a instalação Python gerenciada pelo sistema (pip em execução) - consulte Quais são os riscos de executar o 'sudo pip' ? Para uma discussão mais aprofundada sobre o assunto, por favor leia a edição do pip 1668 Padrão para --user e outros questões ligadas a ele.

As soluções mais comuns são:

  • Instalando pacotes Python no diretório inicial do usuário ( esquema do usuário )
  • Compilando o Python a partir da fonte e usando essa instância em vez do sistema um

Teoricamente, outra solução possível seria usar a opção --target com pip e definir a variável de ambiente PYTHONPATH . No entanto, a opção --target tem muitos (atualmente 12) problemas .

    
por 08.05.2016 / 23:31