【问题标题】:Call a function from another file?从另一个文件调用函数?
【发布时间】:2013-12-17 01:10:33
【问题描述】:

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

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

我试过了:

from file.py import function(a,b)

但我得到了错误:

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

我该如何解决这个问题?

【问题讨论】:

  • from file import function。无需文件扩展名或函数参数
  • 你可能应该通过 Python 教程中的modules section
  • 只要确定如果使用 PyCharms,它就只能识别下划线分隔的文件名。
  • 另外,如果你想从file.py导入函数,请确保你的目录中没有名称为file的包。
  • 如果您有 ImportError 或 ModuleError 看到这个问题,这对我很有帮助stackoverflow.com/questions/31279446/…

标签: python file function import


【解决方案1】:

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

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

【讨论】:

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

首先你不需要.py

如果你有一个文件a.py 并且里面有一些函数:

def b():
  # Something
  return 1

def c():
  # Something
  return 2

你想在z.py中导入它们你必须写

from a import b, c

【讨论】:

  • 你也可以导入*
  • @DimitarMarinov 将 * 替换为文件名?
  • @Karlo,不,只是 *
  • 使用“import *”被认为是一种不好的做法。显式优于隐式。
  • 如果a.py在一个文件夹说fol1,那么应该如何导入呢? @dimitar-marinov
【解决方案3】:

首先将文件保存为 .py 格式(例如,my_example.py)。 如果那个文件有函数,

def xyz():

        --------

        --------

def abc():

        --------

        --------

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

文件名:my_example2.py

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

import my_example.py


a = my_example.xyz()

b = my_example.abc()

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

【讨论】:

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

您应该将该文件与您尝试导入的 Python 文件的位置相同。 '从文件导入功能'也足够了。

【讨论】:

    【解决方案5】:

    您不必添加file.py

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

    from file import a, b
    

    【讨论】:

    • 哦,当然不是。我不是故意输入 .py 的,这是一个错字
    【解决方案6】:

    您可以通过 2 种方式做到这一点。首先只是从file.py中导入你想要的特定功能。为此,请使用

    from file import function
    

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

    import file as fl
    

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

    fl.function(a,b)
    

    【讨论】:

      【解决方案7】:

      假设你要调用的文件是anotherfile.py,你要调用的方法是method1,那么先导入文件再导入方法

      from anotherfile import method1
      

      如果method1是一个类的一部分,让这个类是class1,那么

      from anotherfile import class1
      

      然后创建一个class1的对象,假设对象名是ob1,那么

      ob1 = class1()
      ob1.method1()
      

      【讨论】:

        【解决方案8】:

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

        备选方案 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
        

        【讨论】:

        • 跟PYTHONPATH添加路径不一样吗?
        • 这是一个对我有用的特殊情况,我想在不复制或修改的情况下“借用”一些外部代码。
        【解决方案9】:

        在 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

        【讨论】:

          【解决方案10】:

          遇到了相同的功能,但我必须执行以下操作才能使其正常工作。

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

          .file 导入函数

          【讨论】:

          • 请解释一下?
          • 拯救了我的一天,谢谢。 '。'指向当前工作目录
          【解决方案11】:

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

          那么在调用函数时也要确保:

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

          【讨论】:

            【解决方案12】:

            在我的情况下,我将我的文件命名为 helper.scrap.py 并且无法使其工作,直到我更改为 helper.py

            【讨论】:

            • 我不认为你可以拥有 .或 - 在文件名中
            【解决方案13】:

            如果您的文件位于不同的包结构中,并且您想从不同的包中调用它,那么您可以以这种方式调用它:

            假设您的 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
            

            【讨论】:

            • 不鼓励全局导入。
            • 忍不住指出类似 Java 的文件结构... com.my.example.. 有点戳到我的眼里,虽然它可能只是我。
            • :)...其实我是java背景的
            • 运行代码的工作目录应该是什么?
            • 我正在从“Example3.py”文件中执行这个加法或乘法函数。
            【解决方案14】:

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

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

            from .b import addFun
            

            【讨论】:

              【解决方案15】:

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

              from directory_name.file_name import function_name
              

              以后会用到:function_name()

              【讨论】:

              • 我认为这是一个正确的答案。简洁明了的解决方案。
              【解决方案16】:

              上述任何解决方案都不适合我。我收到ModuleNotFoundError: No module named whtever 错误。 所以我的解决方案是像下面这样导入

              from . import filename # without .py  
              

              在我的第一个文件中,我定义了 fun 函数,如下所示

              # file name is firstFile.py
              def fun():
                print('this is fun')
              

              在第二个文件中,假设我想调用函数 fun

              from . import firstFile
              
              def secondFunc():
                 firstFile.fun() # calling `fun` from the first file
              
              secondFunc() # calling the function `secondFunc` 
              

              【讨论】:

                【解决方案17】:

                在我的主脚本detectiveROB.py 文件中,我需要调用passGen 生成密码哈希的函数,该函数位于modules\passwordGen.py

                对我来说最快最简单的解决方案是

                下面是我的目录结构

                所以在detectiveROB.py 中,我使用以下语法导入了我的函数

                from modules.passwordGen import passGen

                【讨论】:

                  【解决方案18】:

                  只是一个快速的建议, 那些相信自动导入的人在Pycharm中按alt+进入并且无法获得帮助。

                  只需通过以下方式更改要导入的文件名: 右键单击文件并单击重构-> 重命名。 您的自动导入选项将开始出现

                  【讨论】:

                    【解决方案19】:

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

                    # functions
                    def Print_Text():
                        print( 'Thank You')
                    
                    def Add(a,b):
                        c=a+b
                        return c 
                    

                    在另一个文件中:

                    #Import defined functions
                    from myfun import *
                    
                    #Call functions
                    Print_Text()
                    c=Add(1,2)
                    

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

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

                    【讨论】:

                      猜你喜欢
                      • 2021-08-30
                      • 2020-08-25
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-03-11
                      相关资源
                      最近更新 更多