¿Cómo importo otros archivos de Python?
¿Cómo importo archivos en Python? Quiero importar:
- un archivo (por ejemplo
file.py
) - una carpeta
- un archivo dinámicamente en tiempo de ejecución, según la entrada del usuario
- una parte específica de un archivo (por ejemplo, una sola función)
Hay muchas formas de importar un archivo Python, todas con sus ventajas y desventajas.
No elija apresuradamente la primera estrategia de importación que funcione para usted o tendrá que reescribir el código base más adelante cuando descubra que no satisface sus necesidades.
Comenzaré explicando el ejemplo n.° 1 más sencillo y luego pasaré al ejemplo n.° 7 más profesional y sólido.
Ejemplo 1, importar un módulo de Python con un intérprete de Python:
Pon esto en /home/el/foo/fox.py:
def what_does_the_fox_say(): print("vixens cry")
Ingrese al intérprete de Python:
el@apollo:/home/el/foo$ python Python 2.7.3 (default, Sep 26 2013, 20:03:06) >>> import fox >>> fox.what_does_the_fox_say() vixens cry >>>
Importaste fox a través del intérprete de Python, invocaste la función de Python
what_does_the_fox_say()
desde fox.py.
Ejemplo 2, use execfile
o ( exec
en Python 3 ) en un script para ejecutar el otro archivo de Python en su lugar:
Pon esto en /home/el/foo2/mylib.py:
def moobar(): print("hi")
Pon esto en /home/el/foo2/main.py:
execfile("/home/el/foo2/mylib.py") moobar()
ejecuta el archivo:
el@apollo:/home/el/foo$ python main.py hi
La función moobar se importó de mylib.py y estuvo disponible en main.py
Ejemplo 3, Utilizar desde... importar... funcionalidad:
Pon esto en /home/el/foo3/chekov.py:
def question(): print "where are the nuclear wessels?"
Pon esto en /home/el/foo3/main.py:
from chekov import question question()
Ejecútelo así:
el@apollo:/home/el/foo3$ python main.py where are the nuclear wessels?
Si definió otras funciones en chekov.py, no estarán disponibles a menos que
import *
Ejemplo 4: Importar riaa.py si está en una ubicación de archivo diferente a la de donde se importó
Pon esto en /home/el/foo4/stuff/riaa.py:
def watchout(): print "computers are transforming into a noose and a yoke for humans"
Pon esto en /home/el/foo4/main.py:
import sys import os sys.path.append(os.path.abspath("/home/el/foo4/stuff")) from riaa import * watchout()
Ejecutarlo:
el@apollo:/home/el/foo4$ python main.py computers are transforming into a noose and a yoke for humans
Eso importa todo el contenido del archivo externo desde un directorio diferente.
Ejemplo 5, usoos.system("python yourfile.py")
import os
os.system("python yourfile.py")
Ejemplo 6, importe su archivo utilizando el gancho de inicio de Python:
Actualización: este ejemplo solía funcionar tanto para python2 como para 3, pero ahora solo funciona para python2. python3 se deshizo de este conjunto de funciones de inicio de usuario porque los escritores de bibliotecas de Python poco capacitados abusaron de él, usándolo para inyectar descortésmente su código en el espacio de nombres global, antes que todos los programas definidos por el usuario. Si quieres que esto funcione para python3, tendrás que ser más creativo. Si te digo cómo hacerlo, los desarrolladores de Python también desactivarán ese conjunto de funciones, por lo que estarás solo.
Ver: https://docs.python.org/2/library/user.html
Coloque este código en su directorio personal en~/.pythonrc.py
class secretclass:
def secretmessage(cls, myarg):
return myarg + " is if.. up in the sky, the sky"
secretmessage = classmethod( secretmessage )
def skycake(cls):
return "cookie and sky pie people can't go up and "
skycake = classmethod( skycake )
Coloque este código en su main.py (puede estar en cualquier lugar):
import user
msg = "The only way skycake tates good"
msg = user.secretclass.secretmessage(msg)
msg += user.secretclass.skycake()
print(msg + " have the sky pie! SKYCAKE!")
Ejecútelo, debería obtener esto:
$ python main.py
The only way skycake tates good is if.. up in the sky,
the skycookie and sky pie people can't go up and have the sky pie!
SKYCAKE!
Si recibe un error aquí: ModuleNotFoundError: No module named 'user'
entonces significa que está usando python3, los ganchos de inicio están deshabilitados allí de forma predeterminada.
El crédito por este jist es para: https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py Envíe sus barcos.
Ejemplo 7, más sólido: importe archivos en Python con el comando de importación simple:
- Crear un nuevo directorio
/home/el/foo5/
- Crear un nuevo directorio
/home/el/foo5/herp
Cree un archivo vacío llamado
__init__.py
herp:el@apollo:/home/el/foo5/herp$ touch __init__.py el@apollo:/home/el/foo5/herp$ ls __init__.py
Crea un nuevo directorio /home/el/foo5/herp/derp
En derp, crea otro
__init__.py
archivo:el@apollo:/home/el/foo5/herp/derp$ touch __init__.py el@apollo:/home/el/foo5/herp/derp$ ls __init__.py
En /home/el/foo5/herp/derp crea un nuevo archivo llamado
yolo.py
Pon esto ahí:def skycake(): print "SkyCake evolves to stay just beyond the cognitive reach of " + "the bulk of men. SKYCAKE!!"
El momento de la verdad, crea el nuevo archivo
/home/el/foo5/main.py
, pon esto allí;from herp.derp.yolo import skycake skycake()
Ejecutarlo:
el@apollo:/home/el/foo5$ python main.py SkyCake evolves to stay just beyond the cognitive reach of the bulk of men. SKYCAKE!!
El
__init__.py
archivo vacío comunica al intérprete de Python que el desarrollador pretende que este directorio sea un paquete importable.
Si desea ver mi publicación sobre cómo incluir TODOS los archivos .py en un directorio, consulte aquí: https://stackoverflow.com/a/20753073/445131
importlib
se agregó a Python 3 para importar un módulo mediante programación.
import importlib
moduleName = input('Enter module name:')
importlib.import_module(moduleName)
La extensión .py debe eliminarse de moduleName
. La función también define un package
argumento para importaciones relativas.
En Python 2.x:
- Solo
import file
sin la extensión .py - Una carpeta se puede marcar como paquete agregando un
__init__.py
archivo vacío - Puede utilizar la
__import__
función, que toma el nombre del módulo (sin extensión) como una extensión de cadena
pmName = input('Enter module name:')
pm = __import__(pmName)
print(dir(pm))
Escriba help(__import__)
para más detalles.
Primer caso
: desea importar un archivoA.py
dentro de otroB.py
, estos dos archivos están en la misma carpeta, así:
.
├── A.py
└── B.py
Puedes hacer esto en el archivo B.py
:
import A
o
from A import *
o
from A import THINGS_YOU_WANT_TO_IMPORT_IN_A
Entonces podrás utilizar todas las funciones de archivo A.py
en archivoB.py
Segundo caso
Si desea importar un archivofolder/A.py
dentro de otroB.py
, estos dos archivos no están en la misma carpeta, así:
.
├── B.py
└── folder
└── A.py
Puedes hacer esto en el archivo B.py
:
import folder.A
o
from folder.A import *
o
from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A
Entonces podrás utilizar todas las funciones de archivo A.py
en archivoB.py
Resumen
- En el primer caso , archivo
A.py
es un módulo que importas en archivoB.py
, usaste la sintaxisimport module_name
. - In the second case,
folder
is the package that contains the moduleA.py
, you used the syntaximport package_name.module_name
.
For more info on packages and modules, consult this link.