如何导入其他Python文件?

Tam*_*mer 702 python python-import

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

  1. 我怎样才能导入特定的python文件import file.py
  2. 如何导入文件夹而不是特定文件?
  3. 我想根据用户输入在运行时动态加载Python文件.
  4. 我想知道如何从文件中加载一个特定的部分.

例如,main.py我有:

from extra import * 
Run Code Online (Sandbox Code Playgroud)

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

def gap():
    print
    print
Run Code Online (Sandbox Code Playgroud)

我怎么添加到import语句只得到gapextra.py

Eri*_*ski 932

有许多方法可以导入python文件,所有这些方法都有其优缺点.

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

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

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

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

    def what_does_the_fox_say():
      print("vixens cry")
    
    Run Code Online (Sandbox Code Playgroud)
  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
    >>> 
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  1. 把它放在/home/el/foo2/mylib.py中:

    def moobar():
      print("hi")
    
    Run Code Online (Sandbox Code Playgroud)
  2. 把它放在/home/el/foo2/main.py中:

    execfile("/home/el/foo2/mylib.py")
    moobar()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 运行文件:

    el@apollo:/home/el/foo$ python main.py
    hi
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  1. 把它放在/home/el/foo3/chekov.py中:

    def question():
      print "where are the nuclear wessels?"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 把它放在/home/el/foo3/main.py中:

    from chekov import question
    question()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 像这样运行:

    el@apollo:/home/el/foo3$ python main.py 
    where are the nuclear wessels?
    
    Run Code Online (Sandbox Code Playgroud)

    如果您在chekov.py中定义了其他函数,除非您这样做,否则它们将无法使用 import *

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

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

    def watchout():
      print "computers are transforming into a noose and a yoke for humans"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 把它放在/home/el/foo4/main.py中:

    import sys 
    import os
    sys.path.append(os.path.abspath("/home/el/foo4/stuff"))
    from riaa import *
    watchout()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 运行:

    el@apollo:/home/el/foo4$ python main.py 
    computers are transforming into a noose and a yoke for humans
    
    Run Code Online (Sandbox Code Playgroud)

    从不同的目录导入外部文件中的所有内容.

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

import os
os.system("python yourfile.py")
Run Code Online (Sandbox Code Playgroud)

例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 )
Run Code Online (Sandbox Code Playgroud)

将此代码放入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!")
Run Code Online (Sandbox Code Playgroud)

运行:

$ 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!
Run Code Online (Sandbox Code Playgroud)

这个jist的功劳归结为:https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py 沿你的船只发送.

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

  1. 创建一个新目录 ModuleNotFoundError: No module named 'user'
  2. 创建一个新目录 /home/el/foo5/
  3. 创建一个以/home/el/foo5/herpherp 命名的空文件:

    el@apollo:/home/el/foo5/herp$ touch __init__.py
    el@apollo:/home/el/foo5/herp$ ls
    __init__.py
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  6. 在/ home/el/foo5/herp/derp下面创建一个名为__init__.pyPut this 的新文件:

    def skycake():
      print "SkyCake evolves to stay just beyond the cognitive reach of " +
      "the bulk of men. SKYCAKE!!"
    
    Run Code Online (Sandbox Code Playgroud)
  7. 真实的时刻,制作新文件yolo.py,把它放在那里;

    from herp.derp.yolo import skycake
    skycake()
    
    Run Code Online (Sandbox Code Playgroud)
  8. 运行:

    el@apollo:/home/el/foo5$ python main.py
    SkyCake evolves to stay just beyond the cognitive reach of the bulk 
    of men. SKYCAKE!!
    
    Run Code Online (Sandbox Code Playgroud)

    /home/el/foo5/main.py文件与python解释器通信,开发人员希望此目录是可导入的包.

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

奖金protip

无论您使用的是Mac,Linux还是Windows,都需要使用python的空闲编辑器,如此处所述.它将解锁你的python世界. http://www.youtube.com/watch?v=DkW5CSZ_VII

  • 很好的答案,但事实上你一直使用不同的导入文件作为例子使得阅读麻烦. (25认同)
  • 您还应该添加示例6:使用`__import __(py_file_name)`.无论如何惊人的指南 (5认同)
  • 所有这些之间的最大区别是什么,为什么一个比其他任何一个更好?例如5,您编写"使用裸导入命令在python中导入文件",但您也在示例1,3和4中使用(裸?)导入命令,不是吗? (4认同)
  • 我想强调的是,即使您在 Windows 上工作,导入也是区分大小写的。所以你不能有 **Module.py** 并且在你的代码中有 **import module** (4认同)
  • 每次遇到导入问题时,我都会遇到这个问题,并且总是能够解决我的问题。如果每次您帮助我都可以投票赞成,我会的。 (3认同)
  • 还想添加 - 似乎软件包名称中不能有破折号:\ (3认同)
  • 你的开场白应该是每个流行答案的前身,谢谢你,我的分析代码库一团糟,第一次重构。 (2认同)

Rad*_*ian 394

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

import importlib

moduleName = input('Enter module name:')
importlib.import_module(moduleName)
Run Code Online (Sandbox Code Playgroud)

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

  1. 只是import file没有"的.py"扩展.

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

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

    pmName = input('Enter module name:')
    pm = __import__(pmName)
    print(dir(pm))
    
    Run Code Online (Sandbox Code Playgroud)

    键入help(__import__)更多的细节.

  • Python 中的导入是一个奇怪的混乱。应该可以从任何文件导入任何函数,只需一行简单的代码即可提供文件的路径(绝对或相对、硬编码或存储在变量中)。Python,就做吧! (9认同)
  • 来自`help(__ import __)`:`因为这个函数适合Python解释器使用而不是一般用途,所以最好使用importlib.import_module()以编程方式导入模块. (7认同)
  • 如果在__init__.py中添加`import filename`,则可以直接导入模块作为文件夹名称. (6认同)
  • 它在2019年仍然准确吗?是python3还是2? (5认同)
  • 如果它不是一个包而只是一个脚本文件怎么办? (4认同)
  • 对于在同一路径中导入脚本文件(也许它也适用于Python搜索路径中的脚本文件),使用Python 3.4.8,`import filenamenoext`对我来说效果很好. (2认同)

Jam*_*mes 55

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

import os
import sys
Run Code Online (Sandbox Code Playgroud)

...

scriptpath = "../Test/"

# 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
Run Code Online (Sandbox Code Playgroud)

  • 我的朋友今天检查了这个,但没有运气 - 看起来文件名不应该在那里。他在父目录中使用本地文件,“./”在最后工作,就像父目录(..)一样。修复帖子中的问题被拒绝 - 可能是误解(?)如果您不确定,请打印 sys.path 并比较记录... (2认同)
  • 对我来说这是最好的答案,简洁且易于复制 (2认同)

Fat*_*ana 27

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

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

  • 如果我想要相对路径怎么办? (8认同)

San*_*yal 19

导入文档.. - 链接供参考

__init__.py需要这些文件使Python将目录视为包含包,这样做是为了防止具有通用名称的目录(如string)无意中隐藏稍后在模块搜索路径上发生的有效模块.

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

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
Run Code Online (Sandbox Code Playgroud)


Sid*_*Sid 17

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

def greet():
    print('Hello! How are you?')
Run Code Online (Sandbox Code Playgroud)

在您导入函数的文件中,写下:

from x import greet
Run Code Online (Sandbox Code Playgroud)

如果您不想导入文件中的所有函数,这将非常有用。


Dev*_*hat 13

from file import function_name  ######## Importing specific function
function_name()                 ######## Calling function
Run Code Online (Sandbox Code Playgroud)

import file              ######## Importing whole package
file.function1_name()    ######## Calling function
file.function2_name()    ######## Calling function
Run Code Online (Sandbox Code Playgroud)

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


pal*_*asb 9

使用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
Run Code Online (Sandbox Code Playgroud)

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

您可以像这样使用这个函数:

my_module = load_module("file.py", "mymod")
Run Code Online (Sandbox Code Playgroud)

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

file.py:

print(f"file.py was imported as {__name__}")
Run Code Online (Sandbox Code Playgroud)

one.py:

print(f"one.py was imported as {__name__}")
load_module("file.py", "mymod")
import two
Run Code Online (Sandbox Code Playgroud)

two.py:

print(f"two.py was imported as {__name__})")
import mymod
Run Code Online (Sandbox Code Playgroud)

鉴于上面的文件,您可以运行以下命令来查看如何file.py变得可导入。

$ python3 -m one
one.py was imported as __main__
two.py was imported as two
file.py was imported as mymod
Run Code Online (Sandbox Code Playgroud)

这个答案是基于Python官方文档::importlib直接导入源文件。


sup*_*eme 7

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

Mike Grouchy的这篇文章很好地解释了__init__.py它在制作,导入和设置python包中的用途。

  • 你应该已经发布了 Mike Grouchy 帖子的内容,特别是因为链接现在是 404s。https://web.archive.org/web/20190309045451/https://mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html (5认同)
  • @GhostCat 我已经更新了我的回复。感谢链接“这将是可取的”。 (2认同)

小智 7

import sys
#print(sys.path)
sys.path.append('../input/tokenization')
import tokenization
Run Code Online (Sandbox Code Playgroud)

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

首先附加路径,然后导入

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


Sve*_*end 6

我想在其他地方不太清楚地添加这个注释;在模块/包内,从文件加载时,模块/包名称必须以mymodule. 想象一下mymodule这样的布局:

/main.py
/mymodule
    /__init__.py
    /somefile.py
    /otherstuff.py
Run Code Online (Sandbox Code Playgroud)

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

from mymodule.somefile import somefunc
from mymodule.otherstuff import otherfunc
Run Code Online (Sandbox Code Playgroud)


Boh*_* LI 6

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

. 
??? A.py 
??? B.py
Run Code Online (Sandbox Code Playgroud)

您可以在file中执行此操作B.py

import A
Run Code Online (Sandbox Code Playgroud)

要么

from A import *
Run Code Online (Sandbox Code Playgroud)

要么

from A import THINGS_YOU_WANT_TO_IMPORT_IN_A
Run Code Online (Sandbox Code Playgroud)

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


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

.
??? B.py
??? folder
     ??? A.py
Run Code Online (Sandbox Code Playgroud)

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

import folder.A
Run Code Online (Sandbox Code Playgroud)

要么

from folder.A import *
Run Code Online (Sandbox Code Playgroud)

要么

from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A
Run Code Online (Sandbox Code Playgroud)

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


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

有关软件包和模块的更多信息,请参考此链接

  • +1 这就是我一直在寻找的东西。无法理解其他答案,但您使用目录进行了解释。 (3认同)
  • @bytedev 将 `import sys` 和 `sys.path.append("..")` 添加到文件的开头。据此:/sf/answers/3383933171/。经过测试,工作完美,这样做之后,你将能够导入父目录中的py文件,并且仍然能够导入同目录和子目录中的py文件。 (2认同)
  • 这对你来说很酷,兄弟,我使用的是 3.8.x,但它对我不起作用。 (2认同)
  • 我在Windows 8.1;我正在使用 python-3.8.5-embed-amd64。但它不起作用。 (2认同)

Luk*_*359 5

我的导入方式是导入文件并使用其名称的缩写。

import DoStuff.py as DS
DS.main()
Run Code Online (Sandbox Code Playgroud)

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

  • DS是否会尝试从DoStuff中导入py? (2认同)