如何导入其余Python文件?

如何在Python中导入其余文件? html

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

例如,在main.py我有: python

from extra import *

尽管这为我提供了extra.py全部定义,可是也许我想要的只是一个定义: git

def gap():
    print
    print

我怎么添加到import语句先手gapextra.pygithub


#1楼

您没有不少复杂的方法能够将python文件从一个文件夹导入到另外一个文件夹。 只需建立一个__init__.py文件,以声明此文件夹为python软件包,而后转到要导入的主机文件便可,只需键入 编程

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


#2楼

要在“运行时”以已知名称导入特定的Python文件: app

import os
import sys

... ide

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

#3楼

导入python文件的方法有不少,各有利弊。

不要只是匆忙地选择适合您的第一个导入策略,不然稍后您将在发现不符合您的须要时重写代码库。 函数

我将首先说明最简单的示例#1,而后将介绍最专业,最可靠的示例#7 spa

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

示例2,在脚本中使用execfile或( Python 3中的exec )在适当的位置执行另外一个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中可用

示例3,从...使用...导入...功能:

  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 *不然它们将不可用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"
  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

    那会从另外一个目录导入外部文件中的全部内容。

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

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

示例6,经过piggy带python startuphook导入文件:

更新:此示例曾经同时适用于python2和3,但如今仅适用于python2。 python3摆脱了此用户启动钩子功能集,由于它被低技能的python库编写者滥用,使用它在全部用户定义的程序以前不礼貌地将其代码注入到全局名称空间中。 若是您但愿此功能适用于python3,则必须变得更有创意。 若是我告诉您如何作,python开发人员也会禁用该功能集,所以您是一我的。

参见: https : //docs.python.org/2/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!

若是您在此处ModuleNotFoundError: No module named 'user'错误: ModuleNotFoundError: No module named 'user'则意味着您使用的是python3,默认状况下禁用了启动钩。

值得一提的是: 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解释器传达了开发人员打算将此目录做为可导入包的信息。

若是您想看到个人帖子,关于如何在目录下包含全部.py文件,请参见此处: https : //stackoverflow.com/a/20753073/445131


#4楼

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'扩展名的import file便可。

  2. 您能够经过添加一个名为__init__.py的空文件来将文件夹标记为包。

  3. 您可使用__import__函数。 它以模块名称做为字符串。 (一样:模块名称不带“ .py”扩展名。)

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

    键入help(__import__)以得到更多详细信息。


#5楼

导入文档..-连接以供参考

__init__.py文件是使Python将目录视为包含程序包所必需的,这样作是为了防止具备共同名称(例如字符串)的目录无心间隐藏了稍后在模块搜索路径中出现的有效模块。

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

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
相关文章
相关标签/搜索