pip instala pacotes com sucesso, mas executáveis ​​não encontrados na linha de comando

110

Estou trabalhando no mac OS X Yosemite, versão 10.10.3.

Instalei python2.7 e pip usando macport conforme feito em http://johnlaudun.org/20150512-installing-and-setting-pip-with-macports/

Posso instalar pacotes com sucesso e importá-los dentro do meu ambiente Python e scripts Python. No entanto, nenhum executável associado a um pacote que pode ser chamado a partir da linha de comando no terminal foi encontrado.

Alguém sabe o que pode estar errado? (Mais detalhes abaixo)

Por exemplo, ao instalar um pacote chamado "rosdep" conforme instruído em http://wiki.ros.org/jade/Installation/Source

Posso executar: sudo pip install -U rosdep que instala sem erros e os arquivos correspondentes estão localizados em/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages

No entanto, se eu tentar executar sudo rosdep init:, ocorrerá um erro:"sudo: rosdep: command not found"

Este não é um erro específico do pacote. Eu recebo isso para qualquer pacote instalado usando pip no meu computador. Eu até tentei adicionar

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages

para o meu $PATH. Mas os executáveis ​​não são encontrados na linha de comando, embora os pacotes funcionem perfeitamente dentro do python.

Sanket_Diwale
fonte
algum virtualenv envolvido?
JL Peyret
não, nenhum virtualenv está envolvido.
Sanket_Diwale,
ao usar sudo, você muda para $ PATH do usuário root, apenas certifique-se de que seu PATH esteja atualizado, não seu PATH
Anthony Perot

Respostas:

48

verifique o seu $ PATH

tox tem um modo de linha de comando:

audrey:tests jluc$ pip list | grep tox
tox (2.3.1)

Cadê?

(editar: as 2.7coisas não importam muito aqui, sub em qualquer 3.xe pip se comportando da mesma maneira)

audrey:tests jluc$ which tox
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/tox

e o que está em meu $ PATH?

audrey:tests jluc$ echo $PATH
/opt/chefdk/bin:/opt/chefdk/embedded/bin:/opt/local/bin:..../opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin...

Observe o /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin ? Isso é o que permite encontrar minhas coisas instaladas no pip

Agora, para ver de onde vêm as coisas do Python, tente fazer isso (substituir rosdeppor tox).

$python
>>> import tox
>>> tox.__file__

que imprime:

'/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/tox/__init__.pyc'

Agora cd para o diretório acima libno diretório acima. Você vê um diretório bin ? Você vê rosdepnessa lixeira? Nesse caso, tente adicionar o binao seu $ PATH.

audrey:2.7 jluc$ cd /opt/local/Library/Frameworks/Python.framework/Versions/2.7
audrey:2.7 jluc$ ls -1

resultado:

Headers
Python
Resources
bin
include
lib
man
share
JL Peyret
fonte
Obrigado JL pela resposta, mas esse é principalmente meu problema. Para o meu aplicativo de exemplo rosdep, quando faço como você, aqui está a saída obtida: lista de pip | grep rosdep rosdep (0.11.4) which rosdep (sem saída), linha de comando não retorna nada
Sanket_Diwale
1
que não retornar rosdepé consistente com o seu problema. meu ponto é que você precisa descobrir onde o rosdepestá instalado e como $ PATH se parece.
JL Peyret
Obrigado, meus binários também foram instalados em /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin. Adicionado ao PATH e agora está funcionando. Obrigado, eu estava tendo problemas para localizar os binários, pois eles não estavam fornecendo nenhuma saída.
Sanket_Diwale
export PATH = / opt / local / Library / Frameworks / Python.framework / Versions / 2.7 / bin: $ PATH estava faltando em meus caminhos e funcionou para mim no OSX
Caio Iglesias
1
Se você não conseguir encontrar o programa com which(se ainda não estiver em seu caminho), você também pode tentar encontrar o binário usando mlocateno linux ou mdfindno macOS.
jackcogdill
54

No macOS com a instalação padrão do python, você precisa adicionar /Users/<you>/Library/Python/2.7/bin/ao $ PATH.

Adicione isso ao seu .bash_profile:

export PATH="/Users/<you>/Library/Python/2.7/bin:$PATH"

É onde o pip instala os executáveis.

Dica: para a versão não padrão do Python, which pythonencontre o local da instalação do Python e substitua essa parte no caminho acima. (Obrigado pela dica Sanket_Diwale)

joh-mue
fonte
8
O local onde o pip instala depende de como você instalou o python, o MacOS tem várias maneiras de instalar o python, como macports, homebrew e padrão do sistema. Dependendo de qual versão do python está sendo usada, você terá locais diferentes para o pip. Uma maneira fácil de descobrir onde pip e python estão localizados seria usar "which python" no terminal e, em seguida, adicionar o local apropriado ao $ PATH.
Sanket_Diwale
Para macOS 10.14.3 instalando Python 3.6 de python.org, which python3me levou eventualmente (através de um link) para /Library/Frameworks/Python.framework/Versions/3.6/bin/.
Phoenix
42

Se você estiver instalando usando --user(por exemplo pip3.6 install --user tmuxp), é possível obter o diretório de instalação do usuário específico da plataforma do próprio Python usando o sitemódulo . Por exemplo, no macOS:

$ python2.7 -m site --user-base
/Users/alexp/Library/Python/2.7

Ao anexar /bina isso, agora temos o caminho onde os executáveis ​​do pacote serão instalados. Podemos preencher dinamicamente o PATH no arquivo rc do shell com base na saída; Estou usando o bash, mas com sorte isso é portátil:

# Add Python bin directories to path
python3.6 -m site &> /dev/null && PATH="$PATH:`python3.6 -m site --user-base`/bin"
python2.7 -m site &> /dev/null && PATH="$PATH:`python2.7 -m site --user-base`/bin"

Eu uso as versões precisas do Python para reduzir a chance dos executáveis ​​simplesmente "desaparecerem" quando o Python atualiza uma versão secundária, por exemplo, de 3.5 para 3.6. Eles vão desaparecer porque, como pode ser visto acima, o caminho de instalação do usuário pode incluir a versão Python. Portanto, embora python3possa apontar para 3,5 ou 3,6, python3.6sempre apontará para 3,6. Isso precisa ser mantido em mente ao instalar outros pacotes, por exemplo, use pip3.6over pip3.

Se você não se importa com a ideia de pacotes desaparecendo, você pode usar python2e, em python3vez disso:

# Add Python bin directories to path
# Note: When Python is upgraded, packages may need to be re-installed
#       or Python versions managed.
python3 -m site &> /dev/null && PATH="$PATH:`python3 -m site --user-base`/bin"
python2 -m site &> /dev/null && PATH="$PATH:`python2 -m site --user-base`/bin"
Alex Palmer
fonte
21

Eu sei que a pergunta é sobre macOS, mas aqui está uma solução para usuários Linux que chegam aqui via Google.

Eu estava tendo o problema descrito nesta questão, tendo instalado o pacote pdfx via pip.

Porém, quando o executei, nada ...

pip list | grep pdfx
pdfx (1.3.0)

Ainda:

which pdfx
pdfx not found

O problema no Linux é que os pip install ...scripts são inseridos ~/.local/bine não no Debian / Ubuntu padrão $PATH.

Aqui está um problema do GitHub com mais detalhes: https://github.com/pypa/pip/issues/3813

Para corrigir, basta adicionar ~/.local/binao seu $PATH, por exemplo, adicionando a seguinte linha ao seu .bashrcarquivo:

export PATH="$HOME/.local/bin:$PATH"

Depois disso, reinicie seu shell e tudo deve funcionar como esperado.

James Hibbard
fonte
2
Em vez de reiniciar o shell, você pode source ~/.bashrcrecarregar a .bashrcconfiguração
Whiteclaws
1
Ótimo. Estava recebendo "comando tox não encontrado". Depois de atualizar o PATH, ele funciona
GabrielBB
5

Solução

Com base em outras respostas, para linuxe macvocê pode executar o seguinte:

echo "export PATH=\"`python3 -m site --user-base`/bin:$PATH\"" >> ~/.bashrc
source ~/.bashrc

em vez de python3você pode usar qualquer outro link para a versão python: python, python2.7, python3.6, python3.9, etc.

Explicação

Para saber onde os pacotes do usuário estão instalados no SO atual (win, mac, linux), executamos:

python3 -m site --user-base

Sabemos que os scripts vão para a bin/pasta onde os pacotes estão instalados.

Portanto, concatenamos os caminhos:

echo `python3 -m site --user-base`/bin

Em seguida, exportamos isso para uma variável de ambiente.

export PATH=\"`python3 -m site --user-base`/bin:$PATH\""

Finalmente, para evitar a repetição do comando export o adicionamos ao nosso .bashrcarquivo e corremos sourcepara executar as novas alterações, dando-nos a solução sugerida mencionada no início.

Willemoes
fonte
Isso funcionou para mim e não sei por que
Benjamints
@Benjamints acrescentou uma explicação, espero que ajude, boa sorte!
Willemoes
Muito obrigado! :)
Benjamints
3

No Windows, você precisa adicionar o caminho %USERPROFILE%\AppData\Roaming\Python\Scriptsao seu caminho.

Praia de Jared
fonte
2

Eu tropecei nessa questão porque criei, construí e publiquei com sucesso um pacote PyPI, mas não consegui executá-lo após a instalação. o$PATH variável foi definida corretamente.

No meu caso, o problema é que não configurei o entry_pointno setup.pyarquivo:

entry_points = {'console_scripts':

['YOUR_CONSOLE_COMMAND=MODULE_NAME.FILE_NAME:FUNCTION_NAME'],},
Thomas Johannesmeyer
fonte
2

Além de adicionar o bindiretório do python à $PATHvariável, também tive que mudar o proprietário desse diretório para que funcionasse. Não tenho ideia de por que eu já não era o dono.

chown -R ~/Library/Python/
d4Rk
fonte
0

Quando você instala Python ou Python3 usando o instalador do MacOS (baixado do site do Python) - adiciona um exporter ao seu ~/.profilescript. Tudo que você precisa fazer é apenassource isso. Reiniciar todos os terminais também deve resolver.

AVISO - eu acredito que é melhor apenas usar pip3 com Python3 - para benefícios futuros.

Se você já instalou o Python3, as seguintes etapas funcionam para mim no macOS Mojave:

  1. Instale primeiro ansible usando sudo-sudo -H pip3 install ansible

  2. você cria um link simbólico para o bincaminho do Python

sudo ln -s /Library/Frameworks/Python.framework/Versions/Current/bin /Library/Frameworks/Python.framework/current_python_bin

e grampeá-lo para .profile

export PATH=$PATH:/Library/Frameworks/Python.framework/current_python_bin

  1. execute source ~/.profilee reinicie todos os shells do terminal.

  2. Tipo ansible --version

ha9u63ar
fonte