如何导入其他python文件?

How to import other Python files?

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

  • 如何准确导入特定的python文件,如import file.py
  • 如何导入文件夹而不是特定文件?
  • 我希望在运行时基于用户动态加载python文件输入。
  • 我想知道如何从文件中只加载一个特定的部分。
  • 例如,在main.py中,我有:

    1
    from extra import *

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

    1
    2
    3
    def gap():
        print
        print

    我应该在import声明中添加什么,以便从extra.py获得gap


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

    不要草率地选择第一个适合您的导入策略,否则稍后当您发现代码库不符合您的需求时,您将不得不重写代码库。

    我先解释最简单的例子1,然后转向最专业和最强大的例子7。

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

  • 把这个放在/home/el/foo/fox.py中:

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

    1
    2
    3
    4
    5
    6
    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()

  • 示例2,在脚本中使用execfile或(python 3中的exec执行另一个python文件:

  • 把这个放在/home/el/foo2/mylib.py中:

    1
    2
    def moobar():
      print("hi")
  • 把这个放在/home/el/foo2/main.py中:

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

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

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

  • 示例3,使用自…导入…功能:

  • 把这个放在/home/el/foo3/chekov.py中:

    1
    2
    def question():
      print"where are the nuclear wessels?"
  • 把它放在/home/el/foo3/main.py中:

    1
    2
    from chekov import question
    question()
  • 像这样运行:

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

    如果您在chekov.py中定义了其他函数,那么它们将不可用,除非您import *

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

  • 把这个放在/home/el/foo4/stufacture/riaa.py中:

    1
    2
    def watchout():
      print"computers are transforming into a noose and a yoke for humans"
  • 把这个放在/home/el/foo4/main.py中:

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

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

    从另一个目录导入外部文件中的所有内容。

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

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

    示例6,通过piggybacking the python startuphook导入文件:

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

    将此代码放入您在~/.pythonrc.py中的主目录中

    1
    2
    3
    4
    5
    6
    7
    8
    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(可以是任何位置):

    1
    2
    3
    4
    5
    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!")

    运行它:

    1
    2
    3
    4
    $ 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,最健壮的:使用bare import命令在python中导入文件:

  • 新建目录/home/el/foo5/
  • 新建目录/home/el/foo5/herp
  • 在herp下生成一个名为__init__.py的空文件:

    1
    2
    3
    el@apollo:/home/el/foo5/herp$ touch __init__.py
    el@apollo:/home/el/foo5/herp$ ls
    __init__.py
  • 创建新目录/home/el/foo5/herp/derp

  • 在DERP下,再制作一份__init__.py文件:

    1
    2
    3
    el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
    el@apollo:/home/el/foo5/herp/derp$ ls
    __init__.py
  • 在/home/el/foo5/herp/derp下,创建一个名为yolo.py的新文件,将此文件放入其中:

    1
    2
    3
    def skycake():
      print"SkyCake evolves to stay just beyond the cognitive reach of" +
     "the bulk of men. SKYCAKE!!"
  • 在真相时刻,把新文件/home/el/foo5/main.py放在那里;

    1
    2
    from herp.derp.yolo import skycake
    skycake()
  • 运行它:

    1
    2
    3
    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解释器通信,开发人员希望这个目录是一个可导入的包。

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

    奖金提示

    无论您使用的是Mac、Linux还是Windows,您都需要使用这里描述的Python的空闲编辑器。它将开启你的Python世界。http://www.youtube.com/watch?V= DKW5CSZVII VII


    importlib是最近在python中添加的,用于以编程方式导入模块。它只是一个包裹在EDOCX1[1]参见https://docs.python.org/3/library/importlib.html module importlib

    1
    2
    3
    4
    import importlib

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

    更新:下面的答案已过时。使用上面较新的选项。

  • 只有import file没有扩展名".py"。

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

  • 您可以使用__import__功能。它将模块名作为字符串。(同样:没有扩展名".py"的模块名。)

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

    键入help(__import__)了解更多详细信息。


  • 要在"运行时"导入具有已知名称的特定python文件,请执行以下操作:

    1
    2
    import os
    import sys

    1
    2
    3
    4
    5
    6
    7
    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

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

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


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

    为了使python将目录视为包含包,需要使用__init__.py文件,这样做是为了防止具有公共名称(如string)的目录无意中隐藏在模块搜索路径后面出现的有效模块。

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

    1
    2
    3
    4
    5
    mydir/spam/__init__.py
    mydir/spam/module.py
    import spam.module
    or
    from spam import module

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

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

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


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

    Mike Grouchy的这篇文章是对__init__.py及其在创建、导入和设置python包中的用途的一个很好的解释。


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

    1
    2
    import DoStuff.py as DS
    DS.main()

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


    我想在其他地方添加一个我不太清楚的注释;在模块/包中,从文件加载时,模块/包名称必须以mymodule作为前缀。假设mymodule的布局如下:

    1
    2
    3
    4
    5
    /main.py
    /mymodule
        /__init__.py
        /somefile.py
        /otherstuff.py

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

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

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

    目录结构:

    1
    2
    3
    /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:

    1
    2
    3
    4
    5
    import os, sys, inspect

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

    可选(如果您加载配置等)(对于我的用例,inspect似乎是最健壮的一个)

    1
    2
    3
    4
    # 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")

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

    这个解决方案在cli和pycharm中都适用。


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

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

    注意:您可以使用.txt扩展。
    mainfile.py中,从打开和获取内容开始。

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

    现在您将内容作为字符串,但是尝试访问data.testString将导致错误,因为datastr类的一个实例,并且即使它没有testString属性,它也不会像您期望的那样做。接下来,创建一个类。例如(双关语),ImportedFile

    1
        class ImportedFile:

    把这个放进去(有适当的缩进):

    1
        exec(data)

    最后,像这样重新分配data

    1
        data=ImportedFile()

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

    希望这有帮助:)
    -本吉


    这听起来可能很疯狂,但是如果您只是在创建一个包装脚本,那么您可以创建一个指向要导入文件的符号链接。


    你也可以这样做:from filename import something

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


    只需将python文件导入另一个python文件

    假设我有helper.py python文件,它具有如下显示功能:

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

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

    1
    2
    import helper
    helper.display()

    输出,

    I'm working sundar gsv

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