Llamar a una función desde otro archivo en Python


499

Set_up: tengo un archivo .py para cada función que necesito usar en un programa.

En este programa, necesito llamar a la función desde los archivos externos.

He intentado:

from file.py import function(a,b)

Pero me sale el error:

ImportError: ningún módulo llamado 'file.py'; el archivo no es un paquete

¿Cómo soluciono este problema?


65
from file import function. No hay necesidad de extensiones de archivo o parámetros de función
samrap

44
Probablemente debería pasar por la sección de módulos en el tutorial de Python.
Burhan Khalid

Solo asegúrese de que si usa PyCharms, solo reconocerá un nombre de archivo delimitado por subrayado.
Jerry

Además, si desea importar la función desde file.py, asegúrese de que no haya ningún paquete en su directorio con el nombre file.
SomeBruh

Respuestas:


555

No es necesario agregar file.pyal importar. Simplemente escriba from file import functiony luego llame a la función usando function(a, b). La razón por la que esto puede no funcionar es porque filees uno de los módulos principales de Python, por lo que le sugiero que cambie el nombre de su archivo.

Tenga en cuenta que si usted está tratando de funciones de importación de a.pyun archivo llamado b.py, tendrá que asegurarse de que a.pyy b.pyestán en el mismo directorio.


3
El "archivo" era solo un marcador de posición para la pregunta que hago, no el nombre real del archivo. Gracias de cualquier forma. Intentaré esto y te responderé.
user2977230

44
Intenté esto, pero aún muestra el error: ¿Tiene algo que ver con Python 3 o es un problema general?
DarkRose

44
@GamesBrainiac, ¿qué pasa si el archivo desde el que desea importar funciones está en un directorio diferente? ¿Puedo incluir la ruta del archivo anterior al nombre del archivo o hay algo más complicado?
Tom

66
@Tom Debe agregar esa ruta a la variable PYTHONPATH si aún no está allí.
Juegos Brainiac

13
¿Hay alguna manera de importar funciones de a.py a un archivo b.py si no están en el mismo directorio?
Nirvan Sengupta

193

Antes que nada no necesitas a .py.

Si tiene un archivo a.pyy dentro tiene algunas funciones:

def b():
  # Something
  return 1

def c():
  # Something
  return 2

Y si quieres importarlos z.pytienes que escribir

from a import b, c

47
también puedes importar *
Dimitar Marinov

1
@DimitarMarinov ¿Con * reemplazado por el nombre del archivo?
Karlo

3
@Karlo, no, solo *
Dimitar Marinov

26
usar "import *" se considera una mala práctica. Explícito es mejor que implícito.
Francisco Gutiérrez

Si a.py está en una carpeta que dice fol1, ¿cómo se importará? @ dimitar-marinov
Aditya C

57

Puedes hacer esto de 2 maneras. Primero es solo importar la función específica que desea de file.py. Para hacer esto use

from file import function

Otra forma es importar todo el archivo

import file as fl

Luego puede llamar a cualquier función dentro de file.py usando

fl.function(a,b)

36

También puede llamar a la función desde un directorio diferente, en caso de que no pueda o no quiera tener la función en el mismo directorio en el que está trabajando. Puede hacer esto de dos maneras (quizás haya más alternativas, pero estas son las que me han funcionado).

Alternativa 1 Cambie temporalmente su directorio de trabajo

import os

os.chdir("**Put here the directory where you have the file with your function**")

from file import function

os.chdir("**Put here the directory where you were working**")

Alternativa 2 Agregue el directorio donde tiene su función a sys.path

import sys

sys.path.append("**Put here the directory where you have the file with your function**")

from file import function

1
¿No es lo mismo que agregar ruta a PYTHONPATH?
Birish

33

Si su archivo tiene una estructura de paquete diferente y desea llamarlo desde un paquete diferente, puede llamarlo de esa manera:

Digamos que tiene la siguiente estructura de paquete en su proyecto de Python:

Paquete de Python y estructura de archivos

en el com.my.func.DifferentFunctionarchivo python tiene alguna función, como:

def add(arg1, arg2):
    return arg1 + arg2

def sub(arg1, arg2) :
    return arg1 - arg2

def mul(arg1, arg2) :
    return arg1 * arg2

Y desea llamar a diferentes funciones desde Example3.py, luego de la siguiente manera puede hacerlo:

Definir declaración de importación en Example3.py- archivo para importar todas las funciones

from com.my.func.DifferentFunction import *

o defina cada nombre de función que desea importar

from com.my.func.DifferentFunction import add, sub, mul

Luego, en Example3.pypuede llamar a la función para ejecutar:

num1 = 20
num2 = 10

print("\n add : ", add(num1,num2))
print("\n sub : ", sub(num1,num2))
print("\n mul : ", mul(num1,num2))

Salida:

 add :  30

 sub :  10

 mul :  200

3
Se desaconseja la importación global.
jdhao

21

Encontré la misma característica, pero tuve que hacer lo siguiente para que funcione.

Si ve 'ModuleNotFoundError: No module named', probablemente necesite el punto (.) Delante del nombre del archivo como se muestra a continuación;

de la función de importación .file


13

Primero guarde el archivo en formato .py (por ejemplo, my_example.py). Y si ese archivo tiene funciones,

def xyz():

        --------

        --------

def abc():

        --------

        --------

En la función de llamada solo tiene que escribir las siguientes líneas.

nombre_archivo: mi_ejemplo2.py

============================

import my_example.py


a = my_example.xyz()

b = my_example.abc()

============================


2
No sé si mi falla es sobre versiones de Python. Lo que hago al elegir este ejemplo es import fn(sin extensión) y usarlos directamente en el archivo principal fn.my_funcion(). Cuando uso import fn.pyintenta cargar el archivo py.py, que no existe. Usar from fn.py import funcnameno funcionó también. Gracias.
m3nda

13

Cambie el nombre del módulo a otro que no sea 'archivo'.

Entonces también asegúrese de llamar a la función que:

1) si está importando el módulo completo, reitera el nombre del módulo al llamarlo:

import module
module.function_name()

o

import pizza
pizza.pizza_function()

2) o si está importando funciones específicas, funciones con un alias o todas las funciones que usan *, no reitera el nombre del módulo:

from pizza import pizza_function
pizza_function()

o

from pizza import pizza_function as pf
pf()

o

from pizza import *
pizza_function()

9

Las funciones del archivo .py (puede (por supuesto) estar en un directorio diferente) se pueden importar simplemente escribiendo directorios primero y luego el nombre del archivo sin la extensión .py:

from directory_name.file_name import function_name

Y luego se utilizará: function_name()


8

Dentro de MathMethod.Py.

def Add(a,b):
   return a+b 

def subtract(a,b):
  return a-b

Inside Main.Py

import MathMethod as MM 
  print(MM.Add(200,1000))

Salida: 1200


6

No tienes que agregar file.py.

Simplemente mantenga el archivo en la misma ubicación con el archivo desde donde desea importarlo. Luego solo importa tus funciones:

from file import a, b

Oh claro que no. No quise escribir .py Es un error tipográfico
Mohan

4

Debe tener el archivo en la misma ubicación que la de los archivos de Python que está intentando importar. También 'desde la función de importación de archivos' es suficiente.


4

agregue un punto (.) delante del nombre de un archivo si desea importar este archivo que está en el mismo directorio donde está ejecutando su código.

Por ejemplo, estoy ejecutando un archivo llamado a.py y quiero importar un método llamado addFun que está escrito en b.py, y b.py está en el mismo directorio

desde .b import addFun


2

Supongamos que el archivo al que desea llamar es anotherfile.py y el método al que desea llamar es method1, luego importe primero el archivo y luego el método

from anotherfile import method1

si método1 es parte de una clase, deje que la clase sea clase1, luego

from anotherfile import class1

luego cree un objeto de clase1, suponga que el nombre del objeto es ob1, luego

ob1 = class1()
ob1.method1()

2

en mi caso nombré mi archivo helper.scrap.pyy no pude hacerlo funcionar hasta que cambié ahelper.py


1
No creo que puedas tener. o, en los nombres de los archivos
JeffCharter el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.