从Python中的另一个文件调用函数


496

设置:我需要在程序中使用每个函数的.py文件。

在此程序中,我需要从外部文件调用该函数。

我试过了:

from file.py import function(a,b)

但是我得到了错误:

ImportError:没有名为“ file.py”的模块;文件不是包

我该如何解决这个问题?


65
from file import function。无需文件扩展名或功能参数
samrap 2013年

4
您可能应该仔细阅读Python教程中的“ 模块”部分
Burhan Khalid

只要确保如果使用PyCharms,那么它将只能识别下划线分隔的文件名。
杰里(Jerry)

另外,如果要从中导入函数file.py,请确保目录中没有名称为的软件包file
SomeBruh

Answers:


552

file.py导入时无需添加任何内容。只需编写from file import function,然后使用调用函数function(a, b)。之所以可能不起作用,是因为它file是Python的核心模块之一,所以我建议您更改文件名。

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


3
“文件”只是我所问问题的占位符,而不是实际文件名。不过谢谢你 我会尝试的,并尽快回复您。
user2977230 2013年

4
我试过了,但是它仍然显示错误:它与Python 3有关系,还是一个普遍的问题?
DarkRose

4
@GamesBrainiac,如果要从中导入功能的文件位于不同目录怎么办?我可以在文件名之前包含文件路径,还是更复杂?
汤姆(Tom)

5
@Tom如果该路径尚未存在,则必须将该路径添加到PYTHONPATH变量中。
Games Brainiac

13
如果函数不在同一目录中,是否可以将函数从a.py导入文件b.py?
Nirvan Sengupta

192

首先,您不需要.py

如果您有文件a.py并且内部有一些功能:

def b():
  # Something
  return 1

def c():
  # Something
  return 2

而您要导入它们,z.py您必须编写

from a import b, c

47
您也可以导入*
Dimitar Marinov

1
@DimitarMarinov用*替换文件名吗?
卡洛

3
@Karlo,不,仅*
Dimitar Marinov

26
使用“导入*”被认为是不好的做法。显式胜于隐式。
弗朗西斯科·古铁雷斯

如果a.py在文件夹中,则说fol1,那么如何导入它?@ dimitar-marinov
Aditya C

57

您可以通过2种方式执行此操作。首先只是从file.py导入所需的特定功能。为此使用

from file import function

另一种方法是导入整个文件

import file as fl

然后您可以使用以下命令在file.py中调用任何函数

fl.function(a,b)

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添加路径不一样吗?
Birish

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

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 2015年

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

9

.py文件中的函数(可以(当然)可以在不同目录中)可以通过首先写入目录然后输入不带.py扩展名的文件名来简单地导入:

from directory_name.file_name import function_name

后来被使用: function_name()


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


6

您不必添加file.py

只需将文件与文件导入位置保持在相同位置即可。然后只需导入您的函数:

from file import a, b

哦,肯定不是。我本不想输入.py这是一个错字
-Mohan

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

然后创建一个class1对象,假设对象名称是ob1,然后

ob1 = class1()
ob1.method1()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.