如何从另一个.py文件中调用函数?

801

file.py包含一个名为function的函数。我该如何导入它?

from file.py import function(a,b)

上述代码出现了错误:

ImportError: 找不到名为 'file.py' 的模块; file 不是一个包


110
从文件中导入函数。不需要文件扩展名或函数参数。 - samrap
11
你可能需要阅读Python教程中的模块部分 - Burhan Khalid
1
此外,如果您想从 file.py 导入函数,请确保您的目录中没有名为 file 的包。 - SomeBruh
如果你遇到了 ImportError 或者 ModuleError,可以参考这个问题,对我非常有帮助。 https://dev59.com/uV0Z5IYBdhLWcg3wlRMV#33615230 - Sunchock
from your_file_name import * 对我有效。 - Doğaç
19个回答

828

首先,从file.py中导入function

from file import function

稍后,使用以下方式调用该函数:

function(a, b)

请注意,file 是 Python 核心模块之一,因此我建议您将 file.py 的文件名更改为其他名称。

请注意,如果您正在尝试从 a.py 导入函数到名为 b.py 的文件中,则需要确保 a.pyb.py 在同一个目录中。


10
“file”只是我所问问题时使用的占位符,不是实际的文件名。谢谢你的回答。我会尝试这样做并向您反馈结果。 - user2977230
8
我尝试过这个方法,但是还是出现错误:这与Python 3有关吗,还是一个通用的问题? - DarkRose
13
@GamesBrainiac,如果您想从不同目录中导入函数的文件,我该怎么办?我可以在文件名之前包含文件路径吗?还是需要更复杂的操作? - Tom
11
如果PYTHONPATH变量中没有该路径,你需要将其添加进去。 - Games Brainiac
33
如果a.py和b.py不在同一个目录下,是否有方法将a.py中的函数导入到b.py文件中? - Nirvan Sengupta
显示剩余6条评论

301

导入时不要写 .py

file_a.py 包含一些函数:

def f():
  return 1

def g():
  return 2

要将这些函数导入到file_z.py中,请执行以下操作:

from file_a import f, g

62
你也可以使用“import *”进行导入。 - Dimitar Marinov
1
@DimitarMarinov 用文件名替换 *? - Karlo
4
@Karlo,不,只是* - Dimitar Marinov
49
使用 "import *" 被认为是一种不好的做法。明确比含蓄更好。 - Francisco Gutiérrez
1
如果a.py在一个名为fol1的文件夹中,那么应该如何导入它?@dimitar-marinov - Aditya C
显示剩余2条评论

111
如果您的文件位于不同的包结构中,并且您想从不同的包中调用它,那么您可以以以下方式调用它:
假设您在Python项目中具有以下包结构:

Python package and file structure

在 - com.my.func.DifferentFunction.py 文件中,你有一些函数,比如:
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

7
不鼓励使用全局导入。 - jdhao
2
无法抑制指出Java般的文件结构...com.my.example..有点刺眼,不过也许只有我这样。 - 0xc0de
2
运行代码的工作目录应该是什么? - Pe Dro
我正在从“Example3.py”文件中执行这个加法或乘法函数。 - abanmitra

100

方法1。 从file.py中导入您需要的特定函数:

from file import function

方法二:导入整个文件:

import file as fl

接下来,要调用file.py内的任何函数,请使用:

fl.function(a, b)

51
您也可以从不同的目录调用函数,以防您无法或不想将函数放在您正在工作的同一目录中。 您可以通过两种方式实现此操作(也许有更多选择,但这些是对我有效的选项)。
备选方案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

2
这不就相当于将路径添加到PYTHONPATH中吗? - Birish
2
这是在我想要“借用调用”一些外部代码而不进行复制或修改的特殊情况下对我有效的方法。 - Pieter21

41

修复方法:

ModuleNotFoundError: 找不到名为的模块。

尝试在文件名前使用点号(.)进行相对导入:

from .file import function

2
请问有关于这个的任何解释吗? - Haha
4
救了我的一天,谢谢。'.'指向当前工作目录。 - Shubh

39

可以从.py文件中导入函数(当然也可以在不同的目录中),只需先写目录,然后再写文件名,但不需要包括 .py扩展名:

from directory_name.file_name import function_name

之后可以使用:function_name()


17

将模块重命名为除'file'以外的其他名称。

在调用该函数时,请确保:

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()

这是最好的答案,因为它详细说明了如何导入一个充满函数的文件,并如何调用它们。 - Dave

14

首先以 .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_function()。当我使用 import fn.py 时,它会尝试加载 py.py 文件,但该文件不存在。使用 from fn.py import funcname 也不起作用。谢谢。 - m3nda

11

如果您想要导入与正在运行代码相同目录下的文件,需要在文件名前添加一个点.

例如,我正在运行名为a.py的文件,并且我想要导入一个名为addFun的方法,该方法被写在b.py中,并且b.py就在相同的目录中。

from .b import addFun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接