如何导入其他Python文件?

时间:2010-02-28 03:40:11

标签: python python-import

如何在Python中导入其他文件?

  1. 我究竟如何导入import file.py等特定的python文件?
  2. 如何导入文件夹而不是特定文件?
  3. 我想在运行时根据用户动态加载Python文件 输入
  4. 我想知道如何从文件中加载一个特定的部分。
  5. 例如,在main.py我有:

    from extra import * 
    

    虽然这给了我extra.py中的所有定义,但是我想要的只是一个定义:

    def gap():
        print
        print
    

    我要在import语句中添加什么才能从gap获取extra.py

22 个答案:

答案 0 :(得分:838)

导入python文件的方法有很多,都有其优缺点。

不要只是匆匆选择适合您的第一个导入策略,否则当您发现它不符合您的需求时,您将不得不重写代码库。

我将开始解释最简单的示例#1,然后我将转向最专业和最强大的示例#7

示例1,使用python解释器导入python模块:

  1. 将它放在/home/el/foo/fox.py中:

    def what_does_the_fox_say():
      print("vixens cry")
    
  2. 进入python解释器:

    el@apollo:/home/el/foo$ python
    Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
    >>> import fox
    >>> fox.what_does_the_fox_say()
    vixens cry
    >>> 
    

    你通过python解释器导入了fox,从fox.py中调用了python函数what_does_the_fox_say()

  3. 示例2,在脚本中使用execfile或(exec in Python 3)来执行其他python文件:

    1. 将其放入/home/el/foo2/mylib.py:

      def moobar():
        print("hi")
      
    2. 将其放入/home/el/foo2/main.py:

      execfile("/home/el/foo2/mylib.py")
      moobar()
      
    3. 运行文件:

      el@apollo:/home/el/foo$ python main.py
      hi
      

      函数moobar是从mylib.py导入的,并在main.py中可用

    4. 示例3,使用from ... import ...功能:

      1. 将其放入/home/el/foo3/chekov.py:

        def question():
          print "where are the nuclear wessels?"
        
      2. 将其放入/home/el/foo3/main.py:

        from chekov import question
        question()
        
      3. 像这样运行:

        el@apollo:/home/el/foo3$ python main.py 
        where are the nuclear wessels?
        

        如果您在chekov.py中定义了其他功能,除非import *

      4. ,否则它们将无法使用

        示例4,如果riaa.py位于与导入位置不同的文件位置,则导入riaa.py

        1. 把它放在/home/el/foo4/stuff/riaa.py中:

          def watchout():
            print "computers are transforming into a noose and a yoke for humans"
          
        2. 将其放入/home/el/foo4/main.py:

          import sys 
          import os
          sys.path.append(os.path.abspath("/home/el/foo4/stuff"))
          from riaa import *
          watchout()
          
        3. 运行它:

          el@apollo:/home/el/foo4$ python main.py 
          computers are transforming into a noose and a yoke for humans
          

          从其他目录导入外来文件中的所有内容。

        4. 示例5,使用os.system("python yourfile.py")

          import os
          os.system("python yourfile.py")
          

          示例6,通过搭载python startuphook导入文件:

          请参阅:https://docs.python.org/3/library/user.html

          将此代码放入~/.pythonrc.py

          中的主目录中
          class secretclass:
              def secretmessage(cls, myarg):
                  return myarg + " is if.. up in the sky, the sky"
              secretmessage = classmethod( secretmessage )
          
              def skycake(cls):
                  return "cookie and sky pie people can't go up and "
              skycake = classmethod( skycake )
          

          将此代码放入main.py(可以是任何地方):

          import user
          msg = "The only way skycake tates good" 
          msg = user.secretclass.secretmessage(msg)
          msg += user.secretclass.skycake()
          print(msg + " have the sky pie! SKYCAKE!")
          

          运行它:

          $ python main.py
          The only way skycake tates good is if.. up in the sky, 
          the skycookie and sky pie people can't go up and  have the sky pie! 
          SKYCAKE!
          

          这个jist的信用是:https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py沿着你的船只发送。

          示例7,最强大:使用裸导入命令在python中导入文件:

          1. 制作新目录/home/el/foo5/
          2. 制作新目录/home/el/foo5/herp
          3. 在herp下创建一个名为__init__.py的空文件:

            el@apollo:/home/el/foo5/herp$ touch __init__.py
            el@apollo:/home/el/foo5/herp$ ls
            __init__.py
            
          4. 制作新目录/ home / el / foo5 / herp / derp

          5. 在derp下,制作另一个__init__.py文件:

            el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
            el@apollo:/home/el/foo5/herp/derp$ ls
            __init__.py
            
          6. 在/ home / el / foo5 / herp / derp下创建一个名为yolo.py的新文件放在那里:

            def skycake():
              print "SkyCake evolves to stay just beyond the cognitive reach of " +
              "the bulk of men. SKYCAKE!!"
            
          7. 真实的时刻,制作新文件/home/el/foo5/main.py,将其放在那里;

            from herp.derp.yolo import skycake
            skycake()
            
          8. 运行它:

            el@apollo:/home/el/foo5$ python main.py
            SkyCake evolves to stay just beyond the cognitive reach of the bulk 
            of men. SKYCAKE!!
            

            __init__.py文件与python解释器通信,开发人员打算将此目录作为可导入的包。

          9. 如果您想查看有关如何在目录下包含所有.py文件的帖子,请参阅此处:https://stackoverflow.com/a/20753073/445131

答案 1 :(得分:355)

importlib是Python最近添加的,以编程方式导入模块。它只是__import__的包装器 见https://docs.python.org/3/library/importlib.html#module-importlib

import importlib

moduleName = input('Enter module name:')
importlib.import_module(moduleName)

更新:以下答案已过时。使用上面更新的替代方案。

  1. 只有import file没有'.py'扩展名。

  2. 您可以通过添加名为__init__.py的空文件将文件夹标记为包。

  3. 您可以使用__import__功能。它将模块名称作为字符串。 (再次:模块名称没有'.py'扩展名。)

    pmName = input('Enter module name:')
    pm = __import__(pmName)
    print(dir(pm))
    

    输入help(__import__)了解详情。

答案 2 :(得分:51)

使用已知名称在'runtime'导入特定的Python文件:

import os
import sys

...

scriptpath = "../Test/MyModule.py"

# Add the directory containing your module to the Python path (wants absolute paths)
sys.path.append(os.path.abspath(scriptpath))

# Do the import
import MyModule

答案 3 :(得分:26)

您没有很多复杂的方法可以将python文件从一个文件夹导入另一个文件夹。只需创建一个 __ init __。py 文件来声明这个文件夹是一个python包,然后转到你要导入的主机文件中输入

from root.parent.folder.file import variable, class, whatever

答案 4 :(得分:17)

Import doc .. - 供参考链接

需要Boolean started = false; // To keep track if we already wrote "Start Value" for (int i = 0; i < records.length; i++) { String record = records.get(i); String[] recordSplit = record.split(","); double value = Double.parseDouble(recordSplit[2]); if(value < 20 && ! started) { // Starting here writer.println(record + ",Start Value"); started = true; continue; // Go to next record } if(i < records.length - 1) { // There is a next value if(Double.parseDouble(records.get(i + 1).split(",")[2]) < 20) { // Next value is also smaller than 20, so keep going writer.println(record); } else { writer.println(record + ",End Value"); started = false; // So we can start again later } else { writer.println(record); } } 文件使Python将目录视为包含包,这样做是为了防止具有通用名称的目录(如string)无意中隐藏稍后在模块搜索路径上发生的有效模块

__init__.py可以只是一个空文件,但它也可以执行包的初始化代码或设置__init__.py变量。

__all__

答案 5 :(得分:11)

from file import function_name  ######## Importing specific function
function_name()                 ######## Calling function

import file              ######## Importing whole package
file.function1_name()    ######## Calling function
file.function2_name()    ######## Calling function

以下是我现在理解的两种简单方法,并确保您的&#34; file.py&#34;要作为库导入的文件仅存在于当前目录中。

答案 6 :(得分:5)

我如何导入导入文件并使用其名称的简写。

import DoStuff.py as DS
DS.main()

不要忘记您的导入文件必须以.py扩展名命名

答案 7 :(得分:5)

导入.py文件的最佳方法是__init__.py。最简单的方法是在your.py文件所在的同一目录中创建一个名为__init__.py的空文件。

Mike Prouchy的这个post__init__.py及其用于制作,导入和设置python包的一个很好的解释。

答案 8 :(得分:4)

我想补充一点,我在其他地方并不十分清楚;在模块/包中,从文件加载时,模块/包名必须以mymodule为前缀。想象mymodule就像这样布局:

/main.py
/mymodule
    /__init__.py
    /somefile.py
    /otherstuff.py

somefile.py加载otherstuff.py / __init__.py时,内容应如下所示:

from mymodule.somefile import somefunc
from mymodule.otherstuff import otherfunc

答案 9 :(得分:2)

有几种方法可以包含名称为abc.py的python脚本

  1. 例如如果您的文件名为abc.py(导入abc) 限制是您的文件应位于您调用Python脚本的位置。
  

导入abc

  1. 例如如果您的python文件位于Windows文件夹中。 Windows文件夹位于您调用Python脚本的位置。
  

从文件夹导入abc

  1. 如果abc.py脚本在文件夹中存在的Insider Internal_folder内部可用,则
  

从folder.internal_folder导入abc

  1. 如上面的詹姆斯回答,如果您的文件位于某个固定位置
  

导入操作系统
  导入系统
  scriptpath =“ ../Test/MyModule.py”
  sys.path.append(os.path.abspath(scriptpath))
  导入MyModule

如果您的python脚本已更新并且您不想上传,请使用这些语句进行自动刷新。奖金:)

%load_ext autoreload 
%autoreload 2

答案 10 :(得分:1)

这听起来很疯狂,但是如果您只是要为其创建包装脚本,则可以仅创建指向要导入文件的符号链接。

答案 11 :(得分:1)

使用 Python 3.5 或更高版本,您可以使用 importlib.util 将任意位置的 .py 文件作为模块直接导入,而无需修改 sys.path

import importlib.util
import sys

def load_module(file_name, module_name)
    spec = importlib.util.spec_from_file_location(module_name, file_name)
    module = importlib.util.module_from_spec(spec)
    sys.modules[module_name] = module
    spec.loader.exec_module(module)
    return module

file_name 参数必须是字符串或类似路径的对象。 module_name 参数是必需的,因为所有加载的 Python 模块都必须有一个(带点的)模块名称(如 sysimportlibimportlib.util),但您可以选择任何可用的这个新模块的名称。

你可以这样使用这个函数:

my_module = load_module("file.py", "mymod")

使用 load_module() 函数将其导入 Python 进程一次后,即可使用为其指定的模块名称导入该模块。

# file.py =
print(f"{__name__} imported (file.py)")
# =========

# one.py ==
print(f"{__name__} imported (one.py)")
load_module("file.py", "mymod")
import two
# =========

# two.py ==
print(f"{__name__} imported (two.py)")
import mymod
# =========

根据上述文件,您可以运行以下命令来查看 file.py 是如何变得可导入的。

$ python3 -m one
__main__ imported (one.py)
two imported (two.py)
mymod imported (file.py)

此答案基于官方 Python 文档:importlib: Importing a source file directly.

答案 12 :(得分:1)

第一种情况:您要导入文件A.py中的文件B.py,这两个文件位于同一文件夹中,如下所示:

. 
├── A.py 
└── B.py

您可以在文件B.py中进行此操作:

import A

from A import *

from A import THINGS_YOU_WANT_TO_IMPORT_IN_A

然后,您将可以使用文件A.py中文件B.py的所有功能


第二种情况:您要在文件folder/A.py中导入文件B.py,这两个文件不在同一文件夹中,如下所示:

.
├── B.py
└── folder
     └── A.py

您可以在文件B中进行此操作:

import folder.A

from folder.A import *

from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A

然后,您将可以使用文件A.py中文件B.py的所有功能


摘要: 在第一种情况下,文件A.py是您在文件B.py中导入的模块,您使用了语法import module_name。在第二种情况下,folder是包含模块A.py的包,您使用了语法import package_name.module_name

有关软件包和模块的更多信息,请查阅此link

答案 13 :(得分:1)

如果要导入的模块不在子目录中,请尝试以下操作并从最深的公共父目录运行app.py

目录结构:

/path/to/common_dir/module/file.py
/path/to/common_dir/application/app.py
/path/to/common_dir/application/subpath/config.json

app.py中,将客户端路径附加到sys.path:

import os, sys, inspect

sys.path.append(os.getcwd())
from module.file import MyClass
instance = MyClass()

可选(如果您加载例如配置文件)(对于我的用例来说,检查似乎是最可靠的选择)

# Get dirname from inspect module
filename = inspect.getframeinfo(inspect.currentframe()).filename
dirname = os.path.dirname(os.path.abspath(filename))
MY_CONFIG = os.path.join(dirname, "subpath/config.json")

运行

user@host:/path/to/common_dir$ python3 application/app.py

此解决方案在cli和PyCharm中都对我有效。

答案 14 :(得分:1)

有很多方法,如上所列,但我发现我只想导入文件内容,并且不想写行和行,也不必导入 other 模块。因此,我想出了一种方法来获取文件内容,即使使用点语法(file.property)也不是将导入的文件与您的文件合并。
首先,这是我要导入的文件,data.py

    testString= "A string literal to import and test with"


注意:您可以改用.txt扩展名。
mainfile.py中,首先打开并获取内容。

    #!usr/bin/env python3
    Data=open('data.txt','r+').read()

现在您将内容作为字符串保存,但是尝试访问data.testString会导致错误,因为datastr类的实例,即使它确实包含属性testString不会达到您的预期。
接下来,创建一个类。例如(双关语)ImportedFile

    class ImportedFile:

并将其放入其中(带有适当的缩进):

    exec(data)


最后,像这样重新分配data

    data=ImportedFile()

就是这样!就像访问其他模块一样,只需输入print(data.testString)即可打印到控制台A string literal to import and test with
但是,如果您想要等同于from mod import *,只需删除类,实例分配,然后取消exec的缩进。

希望这会有所帮助:)
-本吉

答案 15 :(得分:1)

您也可以执行以下操作:from filename import something

示例:from client import Client 请注意,您不需要.py .pyw .pyui扩展名。

答案 16 :(得分:1)

只是在另一个python文件中导入python文件

假设我有 helper.py python文件,它具有类似的显示功能,

def display():
    print("I'm working sundar gsv")

现在在 app.py 中,您可以使用显示功能

import helper
helper.display()

输出,

I'm working sundar gsv

注意:无需指定.py扩展名。

答案 17 :(得分:0)

这就是我从python文件中调用函数的方式,这对我来说可以灵活地调用任何函数。

import os, importlib, sys

def callfunc(myfile, myfunc, *args):
    pathname, filename = os.path.split(myfile)
    sys.path.append(os.path.abspath(pathname))
    modname = os.path.splitext(filename)[0]
    mymod = importlib.import_module(modname)
    result = getattr(mymod, myfunc)(*args)
    return result

result = callfunc("pathto/myfile.py", "myfunc", arg1, arg2)

答案 18 :(得分:0)

Python的一个非常未知的功能是能够导入<svg> <filter id="green" color-interpolation-filters="sRGB"> <feColorMatrix type="matrix" values="0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 "/> </filter> </svg> 文件:

zip

该软件包的文件library.zip |-library |--__init__.py 包含以下内容:

__init__.py

我们可以编写另一个脚本,该脚本可以从zip存档中导入包。只需将zip文件添加到sys.path。

def dummy():
    print 'Testing things out...'

答案 19 :(得分:0)

如果定义的函数在文件x.py中:

def greet():
    print('Hello! How are you?')

在要导入函数的文件中,编写以下代码:

from x import greet

如果您不想将所有功能导入文件中,这将很有用。

答案 20 :(得分:0)

from y import * 
  • 假设您有一个文件 x 和 y。
  • 您想将 y 文件导入到 x。

然后转到您的 x 文件并放置上述命令。要对此进行测试,只需在您的 y 文件中放置一个打印函数,当您的导入成功后,它应该会在 x 文件中打印它。

答案 21 :(得分:0)

import sys
#print(sys.path)
sys.path.append('../input/tokenization')
import tokenization

要导入任何 .py 文件,您可以使用上述代码。

先追加路径再导入

注意:'../input/tokenization'目录包含tokenization.py文件