Gọi một hàm từ một tệp khác trong Python


497

Set_up: Tôi có một tệp .py cho mỗi chức năng tôi cần sử dụng trong một chương trình.

Trong chương trình này, tôi cần gọi hàm từ các tệp bên ngoài.

Tôi đã thử:

from file.py import function(a,b)

Nhưng tôi nhận được lỗi:

ImportError: Không có mô-đun có tên 'file.py'; tập tin không phải là một gói

Làm sao để sửa lỗi này?


65
from file import function. Không cần phần mở rộng tệp hoặc tham số chức năng
samrap

4
Có lẽ bạn nên xem qua phần mô-đun trong hướng dẫn Python.
Burhan Khalid

Chỉ cần chắc chắn rằng nếu sử dụng PyCharm, thì nó sẽ chỉ nhận ra một tên tệp được phân tách bằng dấu gạch dưới.
Jerry

Ngoài ra nếu bạn muốn nhập hàm từ file.py, hãy đảm bảo không có gói nào trong thư mục của bạn có tên file.
Một số

Câu trả lời:


554

Không cần thêm bất cứ thứ gì file.pytrong khi nhập. Chỉ cần viết from file import function, và sau đó gọi hàm bằng cách sử dụng function(a, b). Lý do tại sao điều này có thể không hoạt động, là vì filelà một trong những mô-đun cốt lõi của Python, vì vậy tôi khuyên bạn nên thay đổi tên tệp của mình.

Lưu ý rằng nếu bạn đang cố gắng nhập các hàm từ a.pymột tệp được gọi b.py, bạn sẽ cần đảm bảo rằng a.pyb.pynằm trong cùng một thư mục.


3
"Tệp" chỉ là một trình giữ chỗ cho câu hỏi tôi đang hỏi, không phải tên tệp thực tế. Cảm ơn bạn mặc dù. Tôi sẽ thử điều này và lấy lại cho bạn.
dùng2977230

4
Tôi đã thử điều này, nhưng nó vẫn hiển thị lỗi: Nó có liên quan gì đến Python 3 không, hay là một vấn đề chung?
DarkRose

4
@GamesBrainiac, nếu tệp bạn muốn nhập hàm từ một thư mục khác thì sao? Tôi có thể bao gồm các filepath trước tên tệp, hoặc có cái gì phức tạp hơn không?
Tom

6
@Tom Bạn phải thêm đường dẫn đó vào biến PYTHONPATH nếu nó chưa có trong đó.
Trò chơi Brainiac

13
Có cách nào để nhập các hàm từ a.txt vào một tệp b.txt nếu chúng không nằm trong cùng một thư mục không?
Nirvan Sengupta

193

Trước hết bạn không cần a .py.

Nếu bạn có một tập tin a.pyvà bên trong bạn có một số chức năng:

def b():
  # Something
  return 1

def c():
  # Something
  return 2

Và bạn muốn nhập chúng vào z.pybạn phải viết

from a import b, c

47
bạn cũng có thể nhập *
Dimitar Marinov

1
@DimitarMarinov Với * được thay thế bằng tên tệp?
Karlo

3
@Karlo, không, chỉ *
Dimitar Marinov

26
sử dụng "nhập *" được coi là một thực hành xấu. Rõ ràng là tốt hơn so với ngầm.
Francisco Gutiérrez

Nếu a.py nằm trong một thư mục có tên fol1, thì nó sẽ được nhập như thế nào? @ dimitar-marinov
Aditya C

57

Bạn có thể làm điều này theo 2 cách. Đầu tiên chỉ là nhập chức năng cụ thể mà bạn muốn từ file.py. Để làm điều này sử dụng

from file import function

Một cách khác là nhập toàn bộ tệp

import file as fl

Sau đó, bạn có thể gọi bất kỳ chức năng nào bên trong file.py bằng cách sử dụng

fl.function(a,b)

36

Bạn cũng có thể gọi hàm từ một thư mục khác, trong trường hợp bạn không thể hoặc không muốn có chức năng trong cùng thư mục bạn đang làm việc. Bạn có thể làm điều này theo hai cách (có thể có nhiều lựa chọn thay thế, nhưng đây là những cách đã làm việc cho tôi).

Thay thế 1 Tạm thời thay đổi thư mục làm việc của bạn

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

Thay thế 2 Thêm thư mục nơi bạn có chức năng của mình vào sys.path

import sys

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

from file import function

1
không phải nó giống như thêm đường dẫn đến PYTHONPATH sao?
Birish 18/03/19

33

Nếu tệp của bạn nằm trong cấu trúc gói khác nhau và bạn muốn gọi nó từ một gói khác, thì bạn có thể gọi nó theo kiểu đó:

Giả sử bạn có cấu trúc gói sau trong dự án python của bạn:

Cấu trúc tệp và gói Python

trong com.my.func.DifferentFunctiontập tin python bạn có một số chức năng, như:

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

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

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

Và bạn muốn gọi các chức năng khác nhau Example3.py, sau đó làm theo cách bạn có thể thực hiện:

Xác định câu lệnh nhập trong Example3.py- tệp để nhập tất cả chức năng

from com.my.func.DifferentFunction import *

hoặc xác định từng tên hàm mà bạn muốn nhập

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

Sau đó, Example3.pybạn có thể gọi hàm để thực thi:

num1 = 20
num2 = 10

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

Đầu ra:

 add :  30

 sub :  10

 mul :  200

3
nhập khẩu toàn cầu không được khuyến khích.
jdhao

21

Đã qua tính năng tương tự nhưng tôi đã phải làm dưới đây để làm cho nó hoạt động.

Nếu bạn đang thấy 'ModuleNotFoundError: Không có mô-đun nào được đặt tên', bạn có thể cần dấu chấm (.) Phía trước tên tệp như bên dưới;

từ chức năng nhập khẩu .file


13

Đầu tiên lưu tệp ở định dạng .py (ví dụ my_example.py:). Và nếu tập tin đó có chức năng,

def xyz():

        --------

        --------

def abc():

        --------

        --------

Trong chức năng gọi, bạn chỉ cần gõ các dòng dưới đây.

file_name: my_example2.py

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

import my_example.py


a = my_example.xyz()

b = my_example.abc()

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


2
Tôi không biết nếu thất bại của tôi là về các phiên bản python. Những gì tôi làm chọn ví dụ này là import fn(không có phần mở rộng) và sử dụng chúng trực tiếp trên tệp chính fn.my_funcion(). Khi tôi sử dụng import fn.pycố gắng tải tập tin py.py, sẽ không tồn tại. Sử dụng from fn.py import funcnamekhông làm việc quá. Cảm ơn bạn.
m3nda

13

Đổi tên mô-đun thành một cái gì đó khác với 'tập tin'.

Sau đó, hãy chắc chắn khi bạn gọi hàm đó:

1) nếu bạn đang nhập toàn bộ mô-đun, bạn nhắc lại tên mô-đun khi gọi nó:

import module
module.function_name()

hoặc là

import pizza
pizza.pizza_function()

2) hoặc nếu bạn đang nhập các hàm cụ thể, các hàm có bí danh hoặc tất cả các hàm bằng *, bạn không nhắc lại tên mô-đun:

from pizza import pizza_function
pizza_function()

hoặc là

from pizza import pizza_function as pf
pf()

hoặc là

from pizza import *
pizza_function()

9

Các hàm từ tệp .py (dĩ nhiên (có thể) nằm trong thư mục khác) có thể được nhập đơn giản bằng cách viết thư mục trước và sau đó là tên tệp không có phần mở rộng .py:

from directory_name.file_name import function_name

Và sau này được sử dụng: function_name()


8

Bên trong MathMethod.Py.

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

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

Bên trong Main.Py

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

Đầu ra: 1200


6

Bạn không cần phải thêm file.py.

Chỉ cần giữ tệp ở cùng vị trí với tệp từ nơi bạn muốn nhập tệp. Sau đó, chỉ cần nhập các chức năng của bạn:

from file import a, b

Ồ chắc chắn là không. Tôi không định gõ .py Đó là một lỗi đánh máy
Mohan

4

Bạn nên có tệp ở cùng vị trí với tệp Python bạn đang cố nhập. Ngoài ra 'từ chức năng nhập tệp' là đủ.


4

nối một dấu chấm (.) phía trước tên tệp nếu bạn muốn nhập tệp này trong cùng thư mục nơi bạn đang chạy mã của mình.

Ví dụ: tôi đang chạy một tệp có tên a.py và tôi muốn nhập một phương thức có tên addFun được viết bằng b.py và b.py có trong cùng thư mục

từ .b nhập addFun


2

Giả sử tệp bạn muốn gọi là Anotherfile.py và phương thức bạn muốn gọi là phương thức 1, sau đó trước tiên nhập tệp và sau đó là phương thức

from anotherfile import method1

nếu phương thức 1 là một phần của một lớp, hãy để lớp là lớp1, sau đó

from anotherfile import class1

sau đó tạo một đối tượng của class1, giả sử tên đối tượng là ob1, sau đó

ob1 = class1()
ob1.method1()

2

trong trường hợp của tôi, tôi đặt tên cho tệp của mình helper.scrap.pyvà không thể làm cho nó hoạt động cho đến khi tôi đổi thànhhelper.py


1
Tôi không nghĩ bạn có thể có. hoặc - trong tên tệp
JeffCharter 18/11/19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.