Вызов функции из другого файла в Python

499

Set_up: у меня есть файл .py для каждой функции, которую мне нужно использовать в программе.

В этой программе мне нужно вызывать функцию из внешних файлов.

Я пробовал:

from file.py import function(a,b)

Но я получаю ошибку:

Ошибка импорта: нет модуля с именем file.py; файл не является пакетом

Как мне исправить эту проблему?

user2977230
источник
65
from file import function, Нет необходимости в расширениях файлов или параметрах функций
samrap
4
Вы, вероятно, должны пройти через раздел модулей в руководстве по Python.
Бурхан Халид
Просто убедитесь, что при использовании PyCharms, он будет распознавать только имя файла с разделителями подчеркивания.
Джерри
Также, если вы хотите импортировать функцию из file.py, убедитесь, что в вашем каталоге нет пакета с именем file.
SomeBruh

Ответы:

555

Нет необходимости добавлять file.pyпри импорте. Просто напишите from file import function, а затем вызовите функцию с помощью function(a, b). Причина, по которой это может не сработать, заключается в том, что fileэто один из основных модулей Python, поэтому я предлагаю вам изменить имя вашего файла.

Обратите внимание , что если вы пытаетесь импортировать функции из a.pyв файл с именем b.py, вам нужно будет убедиться , что a.pyи b.pyв том же каталоге.

Игры Brainiac
источник
3
«Файл» был просто заполнителем для вопроса, который я задаю, а не фактическим именем файла. Однако, спасибо. Я попробую это и вернусь к вам.
user2977230
4
Я пробовал это, но все равно показывает ошибку: это имеет какое-либо отношение к Python 3, или это общая проблема?
DarkRose
4
@GamesBrainiac, что если файл, из которого вы хотите импортировать функции, находится в другом каталоге? Могу ли я указать путь к файлу, предшествующий имени файла, или есть что-то более сложное?
Том
6
@Tom Вы должны добавить этот путь в переменную PYTHONPATH, если ее там еще нет.
Игры Brainiac
13
Есть ли способ импортировать функции из a.py в файл b.py, если они не находятся в одном каталоге?
Нирван Сенгупта
193

Прежде всего, вам не нужно .py.

Если у вас есть файл a.pyи внутри у вас есть некоторые функции:

def b():
  # Something
  return 1

def c():
  # Something
  return 2

И вы хотите импортировать их, z.pyвы должны написать

from a import b, c
Сальвадор Дали
источник
47
Вы также можете импортировать *
Димитар Маринов
1
@DimitarMarinov С * заменить на имя файла?
Карло
3
@ Карло, нет, просто *
Димитар Маринов
26
использование «import *» считается плохой практикой. Явное лучше, чем неявное.
Франциско Гутьеррес,
Если a.py находится в папке скажем fol1, то как он будет импортирован? @ dimitar-marinov
Aditya C
57

Вы можете сделать это двумя способами. Во-первых, просто импортируйте нужную функцию из файла file.py. Для этого используйте

from file import function

Другой способ - импортировать весь файл.

import file as fl

Затем вы можете вызвать любую функцию внутри file.py, используя

fl.function(a,b)
Pulkit Bansal
источник
36

Вы также можете вызвать функцию из другого каталога, если вы не можете или не хотите иметь функцию в том же каталоге, где работаете. Вы можете сделать это двумя способами (возможно, есть больше альтернатив, но это те, которые работали для меня).

Альтернатива 1 Временно измените ваш рабочий каталог

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**")

Альтернатива 2 Добавьте каталог, в котором у вас есть функция, в sys.path.

import sys

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

from file import function
Хуан Осса
источник
1
разве это не то же самое, что добавить путь к PYTHONPATH?
Бирш
33

Если ваш файл находится в другой структуре пакета, и вы хотите вызвать его из другого пакета, то вы можете вызвать его следующим образом:

Допустим, у вас есть следующая структура пакета в вашем проекте Python:

Пакет Python и структура файла

В - com.my.func.DifferentFunctionфайле Python у вас есть какая-то функция, например:

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

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

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

И вы хотите вызывать различные функции Example3.py, а затем сделать это следующим образом:

Определить оператор импорта в Example3.pyфайле для импорта всех функций

from com.my.func.DifferentFunction import *

или определите имя каждой функции, которую вы хотите импортировать

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

Затем Example3.pyвы можете вызвать функцию для выполнения:

num1 = 20
num2 = 10

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

Вывод:

 add :  30

 sub :  10

 mul :  200
abanmitra
источник
3
импорт глобуса не рекомендуется.
jdhao
21

Наткнулся на ту же функцию, но мне пришлось сделать ниже, чтобы она заработала.

Если вы видите «ModuleNotFoundError: модуль не назван», вам, вероятно, нужна точка (.) Перед именем файла, как показано ниже;

из функции импорта .file

Рикки Бой
источник
13

Сначала сохраните файл в формате .py (например, my_example.py). И если этот файл имеет функции,

def xyz():

        --------

        --------

def abc():

        --------

        --------

В вызывающей функции вам просто нужно ввести следующие строки.

имя_файла: my_example2.py

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

import my_example.py


a = my_example.xyz()

b = my_example.abc()

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

Нагарадж Симпи
источник
2
Я не знаю, моя ли ошибка из-за версий Python. Что я делаю, выбирая этот пример import fn(без расширения) и используя их непосредственно в основном файле fn.my_funcion(). Когда я использую import fn.pyпытается загрузить файл py.py, который не существует. Использование from fn.py import funcnameтоже не сработало. Спасибо.
m3nda
13

Переименуйте модуль в нечто иное, чем «файл».

Также убедитесь, что при вызове функции:

1) если вы импортируете весь модуль, вы повторяете имя модуля при его вызове:

import module
module.function_name()

или

import pizza
pizza.pizza_function()

2) или если вы импортируете определенные функции, функции с псевдонимом или все функции, использующие *, вы не повторяете имя модуля:

from pizza import pizza_function
pizza_function()

или

from pizza import pizza_function as pf
pf()

или

from pizza import *
pizza_function()
misterrodger
источник
9

Функции из файла .py (могут (конечно) находиться в другом каталоге) можно просто импортировать, сначала написав каталоги, а затем имя файла без расширения .py:

from directory_name.file_name import function_name

И позже будет использоваться: function_name()

Weky
источник
8

Внутри MathMethod.Py.

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

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

Внутри Main.Py

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

Выход: 1200

Mahabubuzzaman
источник
6

Вам не нужно добавлять file.py.

Просто храните файл в одном месте с файлом, из которого вы хотите его импортировать. Затем просто импортируйте ваши функции:

from file import a, b
Mohan
источник
О, конечно, это не так. Я не хотел печатать .py Это опечатка
Мохан,
4

Файл должен быть в том же месте, что и файлы Python, которые вы пытаетесь импортировать. Также достаточно «из функции импорта файлов».

Гириш М
источник
4

добавьте точку (.) перед именем файла, если вы хотите импортировать этот файл, который находится в том же каталоге, где вы выполняете свой код.

Например, я запускаю файл с именем a.py и хочу импортировать метод с именем addFun, который написан на b.py, и b.py находится в том же каталоге

из .b import addFun

Шраван Кумар
источник
2

Предположим, файл, который вы хотите вызвать, - anotherfile.py, а метод, который вы хотите вызвать, - method1, затем сначала импортируйте файл, а затем метод

from anotherfile import method1

если method1 является частью класса, пусть класс будет class1, тогда

from anotherfile import class1

затем создайте объект класса 1, предположим, что имя объекта - ob1, затем

ob1 = class1()
ob1.method1()
Amir Md Amiruzzaman
источник
2

в моем случае я назвал свой файл helper.scrap.pyи не мог заставить его работать, пока я не изменился наhelper.py

bresleveloper
источник
1
Я не думаю, что вы можете иметь. или - в именах файлов
JeffCharter