¿Dónde debería poner mi propio módulo de Python para que pueda ser importado?

86

Tengo mi propio paquete en Python y lo uso con mucha frecuencia. ¿Cuál es el directorio más elegante o convencional donde debo poner mi paquete para que se importe sin jugar con PYTHONPATH o sys.path?

¿Qué pasa con los paquetes de sitios, por ejemplo? /usr/lib/python2.7/site-packages.
¿Es común en Python copiar y pegar el paquete allí?

Cobry
fuente
1
hacer un setup.py que diga las dependencias y lo que no y usarlo es una mejor práctica y será más portátil ... pero sí, típicamente, copiar / pegar funcionará bien ... aunque generalmente hago una carpeta adicional llamada "usuario / lib / "o algo así y póngalos todos allí y asegúrese de que esté en mi PYTHONPATH
Joran Beasley
1
Respuesta REAL: No me gustan otras respuestas para scripts personales simples / paquetes no distribuidos, como @JoranBeasley: cree una carpeta para guardar sus scripts (o enlaces a ellos) y agregue esa carpeta a PYTHONPATH desde su bash árbol de runcom (por ejemplo, coloque scripts / enlaces ~/foo/bar/, agregue export PYTHONPATH=~/foo/bar # fields separated by ":"a su ~/.bashrcarchivo). Vea man python, esta ruta manual precede a la ruta de búsqueda predeterminada de Python. Cuidado con las colisiones de nombres.

Respuestas:

60

Por lo general, coloco las cosas que quiero tener listas para importar en el directorio del sitio del usuario:

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

Para mostrar el directorio correcto para su plataforma, puede usar python -m site --user-site


editar: aparecerá en sys.pathuna vez que lo cree:

mkdir -p "`python -m site --user-site`"
mata
fuente
cuando abro Python desde una terminal, esto es lo que da sys.path. observe que no hay locales ['', '/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
al ejecutar un script esto es lo que le da ['/ 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 pero esto no está entre sys.path !!
Cobry
@Cobry python -m site --user-sitele dirá qué directorio debe crear. No aparecerá sys.moduleshasta que lo haya creado.
Aya
@mata Probablemente debería cambiar mkdira mkdir -ppara crear los directorios intermedios. Ni siquiera tenía un ~/.local. ;-)
Aya
27

Entonces, si eres un novato como yo y tus directorios no están muy bien organizados, quizás quieras probar este método.

Abre tu terminal de Python. Importe un módulo que sepa que funciona como numpy en mi caso y haga lo siguiente. Import numpy

numpy.__file__

lo que resulta en

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

El resultado numpy.__file__es la ubicación en la que debe colocar el archivo python con su módulo (excluyendo el numpy/__init__.py), por lo que para mí sería

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

Para hacer esto, vaya a su terminal y escriba

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

Ahora debería poder importar su módulo.

arie64
fuente
¿Cómo es que en mi Python, el "._file_" no funciona? >>> import re >>> re._file_ Traceback (última llamada más reciente): Archivo "<pyshell # 10>", línea 1, en <module> re._file_ AttributeError: el módulo 're' no tiene ningún atributo ' archivo '
Urso
3
@Urso ¿Estás seguro de que estás usando dos guiones bajos? El comando re.__file__funcionó para mí.
arie64
Muchas gracias, @ arie64 por una solución tan limpia. ¡¡También funcionó bien para mí !!
Bms bharadwaj
Gracias, esto funcionó para mí también. Pero extrañamente no puedo encontrar el directorio / carpeta al que envié mi módulo en el Explorador de archivos. Parece que la carpeta no existe. ¿Alguna idea de por qué la carpeta no aparece donde debería? (He habilitado "mostrar elementos ocultos", por lo que no es simplemente eso ...)
Andre
7

Esto es algo que funciona para mí (tengo que crear con frecuencia paquetes de Python que se cargan en un repositorio privado de pip). elaborando el comentario de @joran sobre la pregunta.

  1. cree un "directorio de compilación" que se utiliza como espacio de trabajo para crear paquetes. cualquier directorio de su elección servirá
  2. Copie el directorio de su paquete de Python allí y cree un archivo setup.py. esto debería ayudar a crear setup.py correctamente.
  3. crea un virtualenv para el proyecto en el que estás trabajando. Los virtualenvs tienen muchos otros beneficios, no voy a entrar en detalles aquí.
  4. cree un paquete dist local python setup.py sdist --format=tar. idealmente, el paquete creado debería estar en la distcarpeta.
  5. Instale el paquete en su virtualenv (después de activarlo). pip install <yourpackage>.tar

puede usar pip install --force-reinstallsi necesita jugar más con las bibliotecas y volver a crear los paquetes dist.

Descubrí que este método me funciona muy bien. Si no necesita empaquetar los módulos para el uso de otros sistemas en lugar del local, este método puede ser excesivo.

Feliz piratería.

srj
fuente
1

En mi Mac, hice un sudo find / -name "site-packages". Eso me dio un par de caminos como /Library/Python/2.6/site-packages, /Library/Python/2.7/site-packages, y /opt/X11/lib/python2.6/site-packages.

Entonces, sabía dónde colocar mis módulos si estaba usando v2.7 o v2.6.

Espero eso ayude.

Probando 123
fuente
1

Las carpetas de importación se pueden extraer agregando el siguiente código fuente:

import sys
print sys.path

El ejemplo de generación automática de enlaces simbólicos sería:

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

en lugar de "em", puede usar otro paquete que "acaba de instalar pero Python no puede verlo"

a continuación, explicaré con más detalles como se solicita en el comentario.

supongamos que ha instalado el módulo de python em o pyserial con el siguiente comando (los ejemplos son para ubuntu):

sudo pip install pyserial

y la salida es así:

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

la pregunta sería la siguiente: Python no puede ver el módulo pyserial, ¿por qué? porque la ubicación donde se instaló el módulo no es la que Python está buscando para su cuenta de usuario en particular.

solución: tenemos que crear un enlace simbólico desde la ruta donde llegó pyserial hasta la ruta donde está buscando su python.

El comando de creación de enlace simbólico sería:

ln -s <what_to_link> <where_to_link>

en lugar de escribir la ubicación exacta, le pedimos a pip que nos diga dónde almacenó los módulos ejecutando el comando:

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

en lugar de escribir la ubicación exacta, le pedimos a Python que nos diga dónde busca los módulos que se están instalando ejecutando el comando:

python -m site --user-site

Ambos comandos deben escaparse con el carácter "` "(generalmente a la izquierda de su botón 1 para los teclados de EE. UU.)

como resultado, se proporcionará el siguiente comando para ln y se creará el enlace simbólico faltante:

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

o algo similar, dependiendo de su distribución y los valores predeterminados de python / pip.

Oleg Kokorin
fuente
Parece un resumen poderoso ... ¿puede explicarnos un poco para nosotros, los novatos en Linux? La gente puede ser cautelosa al usar algo que no entienden :-)
pianoJames
-1

Si está desarrollando un módulo, le recomendaría seguir esto.

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

Ahora, cualquier módulo que guarde python-packagesse puede importar Python-interpreter.

AA Shakil
fuente