¿Cómo incluir código Python externo para usar en otros archivos?

117

Si tiene una colección de métodos en un archivo, ¿hay alguna manera de incluir esos archivos en otro archivo, pero llamarlos sin ningún prefijo (es decir, prefijo de archivo)?

Entonces, si tengo:

[Math.py]
def Calculate ( num )

¿Cómo lo llamo así?

[Tool.py]
using Math.py

for i in range ( 5 ) :
    Calculate ( i )
Joan Venge
fuente

Respuestas:

154

Deberá importar el otro archivo como un módulo como este:

import Math

Si no desea prefijar su Calculatefunción con el nombre del módulo, haga esto:

from Math import Calculate

Si desea importar todos los miembros de un módulo, haga esto:

from Math import *

Editar: Aquí hay un buen capítulo de Dive Into Python que profundiza un poco más en este tema.

Andrew Hare
fuente
9
A tener en cuenta que from Math import *se no se recomienda .
nada101
1
Puede interesante impmódulo y llamada mágica __import__.
Vitold S.
Alguien olvidó renovar su dominio: \
Spechal
48

Simplemente escriba el comando "incluir":

import os

def include(filename):
    if os.path.exists(filename): 
        execfile(filename)


include('myfile.py')

@Deleet:

El comentario de @bfieck es correcto, para la compatibilidad con Python 2 y 3, necesita:

Python 2 y 3: alternativa 1

from past.builtins import execfile

execfile('myfile.py')

Python 2 y 3: alternativa 2

exec(compile(open('myfile.py').read()))
Luis
fuente
3
¿Hay alguna razón para volver a hacer esto from module import *? Además, si el archivo al que está llamando tiene código en el cuerpo, ese código se ejecutará, si hace esto.
naught101
4
@ naught101: Ese es el objetivo: ejecutar el código, lo que no sucede con una importación. Por lo general, solo se trata de definir variables.
Louis
2
@Deleet Python 3 no tieneexecfile
bfieck
7
En realidad, Python 3 tiene otra firma compile()que la mencionada. Entonces, Python 2 y 3 correctos: la alternativa 2 será:exec(compile(source=open('myfile.py').read(), filename='myfile.py', mode='exec'))
TriAnMan
3
La función auxiliar 'incluir' no funciona si desea tener variables en el archivo incluido en el alcance en el llamador de 'incluir'
paulj
35

Si utiliza:

import Math

entonces eso te permitirá usar las funciones de Math, pero debes hacer Math.Calculate, por lo que obviamente eso es lo que no quieres.

Si desea importar las funciones de un módulo sin tener que prefijarlas, debe nombrarlas explícitamente, como:

from Math import Calculate, Add, Subtract

Ahora, puede hacer referencia a Calcular, Sumar y Restar solo por sus nombres. Si desea importar TODAS las funciones de Math, haga:

from Math import *

Sin embargo, debe tener mucho cuidado al hacer esto con módulos cuyo contenido no está seguro. Si importa dos módulos que contienen definiciones para el mismo nombre de función, una función sobrescribirá a la otra, sin que usted se entere.

centeno
fuente
1

He encontrado que el módulo de inspección de Python es muy útil

Por ejemplo con teststuff.py

import inspect

def dostuff():
    return __name__

DOSTUFF_SOURCE = inspect.getsource(dostuff)

if __name__ == "__main__":

    dostuff()

Y desde otro script o la consola de Python

import teststuff

exec(DOSTUFF_SOURCE)

dostuff()

Y ahora dostuff debería estar en el ámbito local y dostuff () devolverá la consola o los scripts _ name _ mientras que ejecutar test.dostuff () devolverá el nombre de los módulos de Python.

más duro
fuente