Si este es mi árbol de directorios

temp
├── __init__.py
└── __main__.py

0 directories, 2 files

Y tengo el siguiente código en __init__.py y en __main__.py

__init__.py

"""Initializes the module"""

CONSTANT = 1
sys.exit("what is happening here")

__main__.py

# from . import CONSTANT
# from temp import CONSTANT
if __name__ == "__main__":

    print "This should never run"

Tengo dos problemas aquí que estoy tratando de resolver

Al ejecutar python . en el directorio temp obtengo el resultado This should never run, ¿no debería inicializarse el módulo primero con el archivo __init__.py que resulta en el aborto?

En segundo lugar, ¿cómo hago para importar en módulos de Python? Ninguna de las dos opciones que he mencionado anteriormente funciona. No puedo hacer from . import CONSTANT ni from temp import CONSTANT en el código anterior. ¿Cuál es la forma correcta de hacer importaciones relativas?

Estoy ejecutando esto en Python 2.7.5, disculpas si esto ya se ha preguntado antes.

1
Curious 7 jun. 2016 a las 20:28

3 respuestas

La mejor respuesta

Debería ejecutarlo desde el directorio temp. Si someDir contiene su directorio temp, entonces:

someDir $ python -m temp   #someDir/temp/__init__.py is your file.

Al correr Python. en el directorio temporal obtengo la salida Esto nunca debería ejecutarse, ¿no debería inicializarse el módulo primero con el archivo init .py que resulta en el aborto?

Si lo ejecuta desde afuera, se llamará __init__.py. Y sys.exit también se llamará.


En segundo lugar, ¿cómo hago para importar en módulos de Python? Ninguna de las dos opciones que he mencionado anteriormente funciona. Yo tampoco puedo hacerlo. import CONSTANT ni desde temp import CONSTANT en el código anterior. ¿Cuál es la forma correcta de hacer importaciones relativas?

Lo estás haciendo bien. Simplemente importe sys en su archivo __init__.py. Y arregle la ortografía de CONSTANT.


Además, ¿por qué necesito la bandera -m? ¿No está bien simplemente hacer python temp desde el directorio padre de temp?

Necesita el indicador -m para indicar que está utilizando paquetes. Si no lo usa, no podrá realizar importaciones relativas.

1
UltraInstinct 7 jun. 2016 a las 17:42

Está ejecutando dentro temp; esto no se considera un paquete y __init__.py no se carga. Solo si el padre del directorio actual está en la ruta de carga del módulo y usted carga explícitamente temp como módulo, se carga __init__.py.

Debido a que temp es no un paquete , no puede usar importaciones relativas aquí. En cambio, cada archivo de Python dentro del directorio se considera un módulo de nivel superior por sí mismos.

Tendrías que moverte al padre del directorio temp y luego ejecutar:

python -m temp

Para que Python importe temp como un paquete y luego ejecute el módulo __main__ en ese paquete.

1
Martijn Pieters 7 jun. 2016 a las 17:42

Cuando le dice a Python que ejecute un directorio, Python no trata el directorio como un paquete . En cambio, Python agrega ese directorio a sys.path y ejecuta su {{ X1}}. __init__.py no se ejecuta y las importaciones relativas no verán el directorio como un paquete.

Si desea ejecutar el __main__.py de un paquete y tratarlo como parte del paquete, con __init__.py ejecutado y todo, vaya al directorio que contiene el paquete y ejecute

python -m packagename
1
user2357112 supports Monica 7 jun. 2016 a las 17:39