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

use*_*230 412 python import file function

Set_up:我有一个.py文件,用于我需要在程序中使用的每个函数.

在这个程序中,我需要从外部文件调用该函数.

我试过了:

from file.py import function(a,b)
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

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

我该如何解决这个问题?

Gam*_*iac 464

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

需要注意的是,如果你想从导入函数a.py到一个名为b.py,您需要确保a.pyb.py在同一目录下.

  • “文件”只是我所问问题的占位符,而不是实际的文件名。不过还是谢谢你。我会试试这个,然后给你回复。 (8认同)
  • 有没有办法将函数从a.py导入到文件b.py,如果它们不在同一目录中? (8认同)
  • @Tom你必须将该路径添加到PYTHONPATH变量(如果它尚未存在). (5认同)
  • @GamesBrainiac,如果要导入函数的文件位于不同的目录中,该怎么办?我可以在文件名之前包含文件路径,还是有更复杂的东西? (4认同)
  • 我试过这个,但它仍然显示错误:它与Python 3有什么关系,还是一般问题? (3认同)

Sal*_*ali 165

首先,你不需要.py.

如果你有一个文件a.py,里面你有一些功能:

def b():
  # Something
  return 1

def c():
  # Something
  return 2
Run Code Online (Sandbox Code Playgroud)

并且你想要导入它们z.py你必须写

from a import b, c
Run Code Online (Sandbox Code Playgroud)

  • 你也可以导入* (41认同)
  • 使用"import*"被认为是一种不好的做法.显式优于隐式. (18认同)
  • @Karlo,不,只是* (3认同)

Pul*_*sal 45

您可以通过两种方式完成此操作.首先只是从file.py导入你想要的特定功能.要做到这一点

from file import function
Run Code Online (Sandbox Code Playgroud)

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

import file as fl
Run Code Online (Sandbox Code Playgroud)

然后你可以调用file.py中的任何函数

fl.function(a,b)
Run Code Online (Sandbox Code Playgroud)


Jua*_*ssa 28

您也可以从不同的目录中调用该函数,以防您不能或不想将该函数放在您正在使用的同一目录中.你可以用两种方式做到这一点(也许有更多的选择,但这些是对我有用的).

备选方案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**")
Run Code Online (Sandbox Code Playgroud)

备选2将具有函数的目录添加到sys.path

import sys

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

from file import function
Run Code Online (Sandbox Code Playgroud)

  • 这不是和添加PYTHONPATH路径一样吗? (2认同)
  • 这是在一种特殊情况下对我有用的方法,在这种情况下,我想“借用调用”一些外部代码而不进行复制或修改。 (2认同)

小智 25

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

from directory_name.file_name import function_name
Run Code Online (Sandbox Code Playgroud)

后来被使用: function_name()


Ric*_*Boy 19

遇到了相同的功能,但我不得不做下面的工作.

如果您看到'ModuleNotFoundError:No module named',您可能需要在文件名前面的点(.),如下所示;

来自.file import funtion

  • 拯救了我的一天,谢谢。'.' 指向当前工作目录 (4认同)
  • 请问对此有什么解释吗? (2认同)

aba*_*tra 16

如果文件位于不同的包结构中,并且您想从其他包中调用它,则可以按照以下方式调用它:

假设您在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
Run Code Online (Sandbox Code Playgroud)

您想从中调用不同的函数Example3.py,然后按照以下方式进行操作:

Example3.py文件中定义导入语句以导入所有功能

from com.my.func.DifferentFunction import *
Run Code Online (Sandbox Code Playgroud)

或定义要导入的每个函数名称

from com.my.func.DifferentFunction import add, sub, mul
Run Code Online (Sandbox Code Playgroud)

然后Example3.py可以调用函数执行:

num1 = 20
num2 = 10

print("\n add : ", add(num1,num2))
print("\n sub : ", sub(num1,num2))
print("\n mul : ", mul(num1,num2))
Run Code Online (Sandbox Code Playgroud)

输出:

 add :  30

 sub :  10

 mul :  200
Run Code Online (Sandbox Code Playgroud)

  • 不鼓励全局导入。 (2认同)
  • 忍不住要指出类似 Java 的文件结构... com.my.example.. 有点刺痛我的眼睛,尽管可能只是我。 (2认同)
  • 运行代码的工作目录应该是什么? (2认同)

小智 12

首先以.py格式保存文件(例如,my_example.py).如果该文件有功能,

def xyz():

        --------

        --------

def abc():

        --------

        --------
Run Code Online (Sandbox Code Playgroud)

在调用函数中,您只需键入以下行.

file_name:my_example2.py

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

import my_example.py


a = my_example.xyz()

b = my_example.abc()
Run Code Online (Sandbox Code Playgroud)

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

  • 我不知道我的失败是否与python版本有关.我选择这个例子的是`import fn`(没有扩展名)并直接在主文件`fn.my_funcion()`上使用它们.当我使用`import fn.py`尝试加载py.py文件时,它不存在.使用`from fn.py import funcname`也不起作用.谢谢. (2认同)

小智 9

将模块重命名为“文件”以外的名称。

然后还要确保在调用函数时:

1)如果要导入整个模块,则在调用它时要重申模块名称:

import module
module.function_name()
Run Code Online (Sandbox Code Playgroud)

要么

import pizza
pizza.pizza_function()
Run Code Online (Sandbox Code Playgroud)

2)或如果要导入特定功能,带别名的功能或所有使用*的功能,则无需重复模块名称:

from pizza import pizza_function
pizza_function()
Run Code Online (Sandbox Code Playgroud)

要么

from pizza import pizza_function as pf
pf()
Run Code Online (Sandbox Code Playgroud)

要么

from pizza import *
pizza_function()
Run Code Online (Sandbox Code Playgroud)


Moh*_*han 6

你不必添加file.py.

只需将文件保存在与要导入文件的文件相同的位置即可.然后只需导入您的功能:

from file import a, b
Run Code Online (Sandbox Code Playgroud)


小智 6

在MathMethod.Py内部。

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

def subtract(a,b):
  return a-b
Run Code Online (Sandbox Code Playgroud)

内部Main.Py

import MathMethod as MM 
  print(MM.Add(200,1000))
Run Code Online (Sandbox Code Playgroud)

输出:1200


Shr*_*mar 6

.如果要导入与运行代码位于同一目录中的文件,请在文件名前附加一个点。

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

from .b import addFun
Run Code Online (Sandbox Code Playgroud)


BER*_*RKO 6

解决方案1:在一个文件中myfun.py定义任意函数。

# functions
def Print_Text():
    print( 'Thank You')

def Add(a,b):
    c=a+b
    return c 
Run Code Online (Sandbox Code Playgroud)

在另一个文件中:

#Import defined functions
from myfun import *

#Call functions
Print_Text()
c=Add(1,2)
Run Code Online (Sandbox Code Playgroud)

解决方案2:如果上述解决方案不适用于 Colab

  1. 创建文件夹myfun
  2. 在此文件夹内创建一个文件__init__.py
  3. 将所有函数写入__init__.py
  4. 从 Colab 笔记本导入您的函数from myfun import *


小智 5

您应该将该文件与您尝试导入的 Python 文件位于同一位置。另外“从文件导入功能”就足够了。