Onde devo colocar meu próprio módulo python para que possa ser importado

86

Eu tenho meu próprio pacote em python e estou usando-o com frequência. qual o diretório mais elegante ou convencional onde devo colocar meu pacote para que seja importado sem brincar com PYTHONPATH ou sys.path?

E os pacotes de sites, por exemplo? /usr/lib/python2.7/site-packages.
É comum em python copiar e colar o pacote lá?

Cobry
fonte
1
faça um setup.py que informa as dependências e o que não é e usa isso é uma prática melhor e será mais portável ... mas sim, normalmente copiar / colar funcionará bem ... embora eu geralmente faça uma pasta extra chamada "user / lib / "ou algo assim e coloque todos lá e certifique-se de que esteja no meu PYTHONPATH
Joran Beasley
1
Resposta REAL: Eu não gosto de outras respostas para scripts pessoais simples / pacotes não distribuídos, como @JoranBeasley: Faça alguma pasta para manter seus scripts (ou links para eles) e adicione essa pasta a PYTHONPATH de dentro de seu bash árvore runcom (por exemplo, colocar scripts / links ~/foo/bar/, adicionar export PYTHONPATH=~/foo/bar # fields separated by ":"ao seu ~/.bashrcarquivo). Veja man python, este caminho manual precede o caminho de pesquisa padrão do Python. Cuidado com as colisões de nomes.

Respostas:

60

Normalmente coloco o que quero ter pronto para importar no diretório do site do usuário:

~/.local/lib/pythonX.X/site-packages

Para mostrar o diretório certo para sua plataforma, você pode usar python -m site --user-site


editar: ele aparecerá sys.pathassim que você criá-lo:

mkdir -p "`python -m site --user-site`"
mata
fonte
quando eu abro o python de um terminal, é isso que sys.path fornece. observe que não há local ['', '/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/lib64/python2.7/site-packages/PIL ',' /usr/lib64/python2.7/site-packages/gst-0.10 ',' / usr / lib64 / python2. 7 / site-packages / gtk-2.0 ',' /usr/lib/python2.7/site-packages ',' /usr/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg -info ']
Cobry
ao executar um script, isso é o que ele fornece ['/ home / username / Desktop / mypackage / Examples', '/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/lib64/python2.7/site-packages/PIL ',' /usr/lib64/python2.7/site-packages /gst-0.10 ',' /usr/lib64/python2.7/site-packages/gtk-2.0 ',' /usr/lib/python2.7/site-packages ',' /usr/lib/python2.7/ site-packages / setuptools-0.6c11-py2.7.egg-info ']
Cobry
python -m site --user-site /home/username/.local/lib/python2.7/site-packages mas não está entre sys.path !!
Cobry
@Cobry python -m site --user-sitelhe dirá qual diretório você deve criar. Ele não aparecerá sys.modulesaté que você realmente o tenha criado.
Aya de
@mata Você provavelmente deve alterar mkdirpara mkdir -ppara criar os diretórios intermediários. Eu nem tinha um ~/.local. ;-)
Aya
27

Portanto, se você é um novato como eu e seus diretórios não são muito bem organizados, tente este método.

Abra seu terminal Python. Importe um módulo que você sabe que funciona como numpy no meu caso e faça o seguinte. Import numpy

numpy.__file__

o que resulta em

'/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages/numpy/__init__.py'

O resultado numpy.__file__é a localização em que você deve colocar o arquivo python com seu módulo (excluindo o numpy/__init__.py), então para mim isso seria

/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages

Para fazer isso, basta ir ao seu terminal e digitar

mv "location of your module" "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages"

Agora você deve ser capaz de importar seu módulo.

arie64
fonte
Por que no meu Python o "._file_" não funciona? >>> import re >>> re._file_ Traceback (última chamada mais recente): Arquivo "<pyshell # 10>", linha 1, em <module> re._file_ AttributeError: o módulo 're' não tem nenhum atributo ' arquivo '
Urso
3
@Urso Tem certeza de que está usando dois sublinhados? O comando re.__file__funcionou para mim.
arie64
Muito obrigado, @ arie64 por uma solução tão limpa. Funcionou bem para mim também !!
Bms bharadwaj
Obrigado, isso funcionou para mim também. Mas, estranhamente, não consigo encontrar o diretório / pasta para onde enviei meu módulo no Explorador de arquivos. Parece que a pasta não existe. Alguma ideia de por que a pasta não aparece onde deveria? (Eu habilitei "mostrar itens ocultos", então não é simplesmente isso ...)
André,
7

Isso é algo que funciona para mim (tenho que frequentemente criar pacotes Python que são carregados para um repositório pip privado). elaborando o comentário de @joran sobre a questão.

  1. crie um "diretório de construção" que é usado como um espaço de trabalho para criar pacotes. qualquer diretório de sua escolha servirá
  2. Copie o diretório do pacote python lá e crie um arquivo setup.py. isso deve ajudar a criar o setup.py corretamente.
  3. crie um virtualenv para o projeto em que está trabalhando. O virtualenvs tem vários outros benefícios, não vou entrar em detalhes aqui.
  4. crie um pacote dist local python setup.py sdist --format=tar. o pacote criado deve estar idealmente na distpasta.
  5. Instale o pacote em seu virtualenv (após ativá-lo). pip install <yourpackage>.tar

você pode usar pip install --force-reinstallse precisar brincar mais com as bibliotecas e recriar os pacotes dist.

Descobri que esse método funciona muito bem para mim. Se você não precisa empacotar os módulos para uso de outros sistemas em vez de apenas seu local, este método pode ser um exagero

Feliz hacking.

srj
fonte
1

No meu Mac, fiz um sudo find / -name "site-packages". Isso deu-me alguns caminhos como /Library/Python/2.6/site-packages, /Library/Python/2.7/site-packages, e /opt/X11/lib/python2.6/site-packages.

Então, eu sabia onde colocar meus módulos se estivesse usando a v2.7 ou v2.6.

Espero que ajude.

Testing123
fonte
1

As pastas de importação podem ser extraídas adicionando o seguinte código-fonte:

import sys
print sys.path

exemplo de geração automática de link simbólico seria:

ln -s \`pip show em | grep "Location"| cut -d " " -f2\` \`python -m site --user-site\`

em vez de "em" você pode usar outro pacote que "acabou de instalar, mas o python não consegue ver"

abaixo vou explicar em mais detalhes conforme solicitado no comentário.

suponha que você instalou o módulo python em ou pyserial com o seguinte comando (os exemplos são para ubuntu):

sudo pip install pyserial

e a saída é assim:

Collecting pyserial
  Downloading pyserial-3.3-py2.py3-none-any.whl (189kB)
    100% |████████████████████████████████| 194kB 2.3MB/s 
Installing collected packages: pyserial
Successfully installed pyserial-3.3

a questão seria a seguinte - python não consegue ver o módulo pyserial, por quê? porque o local onde o módulo foi instalado não é aquele que o python está procurando para sua conta de usuário específica.

solução - temos que criar um link simbólico a partir do caminho onde o pyserial chegou para o caminho que o seu python está procurando.

O comando de criação de link simbólico seria:

ln -s <what_to_link> <where_to_link>

em vez de digitar a localização exata, pedimos ao pip que nos diga onde armazenou os módulos, executando o comando:

pip show pyserial | grep "Location"| cut -d " " -f2

em vez de digitar o local exato, pedimos ao python que nos diga onde ele procura os módulos sendo instalados executando o comando:

python -m site --user-site

ambos os comandos devem ser escapados com o caractere "` "(geralmente à esquerda do botão 1 para os teclados dos EUA)

no resultado, o seguinte comando será fornecido para ln e o link simbólico ausente será criado:

ln -s /usr/local/lib/python2.7/dist-packages /home/<your_username>/.local/lib/python2.7/site-packages 

ou algo semelhante, dependendo de sua distro e padrões de python / pip.

Oleg Kokorin
fonte
Parece um one-liner poderoso ... você pode explicar um pouco para nós novatos no Linux? As pessoas podem ter medo de usar algo que não entendem :-)
pianoJames
-1

Se você estiver desenvolvendo um módulo, eu recomendaria seguir isso.

import sys
sys.path.append("/home/mylinux/python-packages")

Agora, qualquer módulo que você mantém python-packagesé importável por Python-interpreter.

AA Shakil
fonte