operator from extension python packages

from - python module operator



Estructura del paquete Python (2)

Tengo un paquete de Python con varios subpaquetes.

myproject/ __init__.py models/ __init__.py ... controllers/ __init__.py .. scripts/ __init__.py myscript.py

En myproject.scripts.myscript, ¿cómo puedo acceder a myproject.models? He intentado

from myproject import models # No module named myproject import models # No module named models from .. import models # Attempted relative import in non-package

He tenido que resolver esto antes, pero nunca puedo recordar cómo se debe hacer. Simplemente no es intuitivo para mí.


Esta es la versión correcta:

from myproject import models

Si falla con ImportError: No module named foo se debe a que no ha configurado PYTHONPATH para que incluya el directorio que contiene myproject/ .

Me temo que otras personas sugerirán trucos para evitar que se establezca PYTHONPATH . Les insto a que los ignoren. Esta es la razón por la cual existe PYTHONPATH : para decirle a Python dónde buscar el código para cargar. Es robusto, está razonablemente bien documentado y es portátil en muchos entornos. Trucos que la gente juega para evitar tener que configurarlo no es ninguna de estas cosas.

La importación relativa explícita funcionará incluso si no se configura PYTHONPATH , ya que solo puede subir la jerarquía de directorios hasta que encuentre el lugar correcto, no necesita encontrar la parte superior y luego caminar hacia abajo. Sin embargo, no funciona en una secuencia de comandos que pase como argumento de línea de comando a python (o, de manera equivalente, invoque directamente con una línea #!/usr/bin/python ). Esto se debe a que, en ambos casos, se convierte en el módulo __main__ del proceso. No hay ningún lugar para caminar desde __main__ - ¡ya está en la parte superior! Si invoca el código en su script importando ese módulo, entonces estará bien. Es decir, comparar:

python myproject/scripts/myscript.py

a

python -c ''import myproject.scripts.myscript''

Puede aprovechar esto no ejecutando su módulo de script directamente, sino creando un bin/myscript que haga la importación y quizás llame a una función principal:

import myprojects.scripts.myscript myprojects.scripts.myscript.main()

Compare con cómo se definen los guiones de la línea de comandos de Twisted: http://twistedmatrix.com/trac/browser/trunk/bin/twistd


Tu proyecto no está en tu camino.

Opción A

  • Instala tu paquete para que Python pueda encontrarlo a través de su nombre absoluto desde cualquier lugar (utilizando from myproject import models )

Opción B

  • Engaño para agregar el padre relativo a su camino
  • sys.path.append(os.path.abspath(''..''))

Se recomienda la primera opción.