本文目录一览:
- python使用from能导入模版,使用import不能导入模版
- python导入模块的方法有哪些
- [Python 中的import 机制](#Python 中的import 机制)
- 如何在python3中正确导入同一目录下的模块
- python使用相对导入的具体意义?
- python如何导入函数
python使用from能导入模版,使用import不能导入模版
其实也可以把文件夹定义为包,在当前文件夹放一个 __init__.py
的空文件。
这样就可以绝对导入 import module_name.import1
。
或是相对导入 import .import1
。
python导入模块的方法有哪些
方法一
import modname
模块是指一个可以交互使用,或者从另一 Python 程序访问的代码段。只要导入了一个模块,就可以引用它的任何公共的函数、类或属性。模块可以通过这种方法来使用其它模块的功能。
用 import
语句导入模块,就在当前的名称空间(namespace)建立了一个到该模块的引用。这种引用必须使用全称,也就是说,当使用在被导入模块中定义的函数时,必须包含模块的名字。所以不能只使用 funcname
,而应该使用 modname.funcname
。
方法二
from modname import funcname
from modname import fa, fb, fc
或者
from modname import *
与第一种方法的区别:funcname
被直接导入到本地名字空间去了,所以它可以直接使用,而不需要加上模块名的限定。*
表示该模块的所有公共对象(public objects)都被导入到当前的名称空间,也就是任何只要不是以 _
开始的东西都会被导入。
modname
没有被定义,所以 modname.funcname
这种方式不起作用。并且,如果 funcname
已经被定义,它会被新版本(该导入模块中的版本)所替代。如果 funcname
被改成指向其他对象,modname
不会觉察到。
建议:
- 如果你要经常访问模块的属性和方法,且不想一遍又一遍地敲入模块名,使用
from module import
。 - 如果你想要有选择地导入某些属性和方法,而不想要其它的,使用
from module import
。 - 如果模块包含的属性和方法与你的某个模块同名,你必须使用
import module
来避免名字冲突。 - 尽量少用
from module import *
,因为判定一个特殊的函数或属性是从哪来的有些困难,并且会造成调试和重构都更困难。
方法三
内建函数 __import__()
。
除了前面两种使用 import
关键字的方法以外,我们还可以使用内建函数 __import__()
来导入 module。两者的区别是,import
后面跟的必须是一个类型(type),而 __import__()
的参数是一个字符串,这个字符串可能来自配置文件,也可能是某个表达式计算结果。例如:
mymodule = __import__('module_name')
附注:
- 模块的内容都放在一个模块文件中,如
mymodule
的内容应该放在PYTHONPATH
目录下的一个mymodule.py
中,C 实现的除外。 - 包可以将几个模块名称空间组织起来,如
A.b
就表示在包A
中的一个子模块b
。 可以单独导入某一个子模块,如 Python 文档中给出的例子:
import sound.effects.echo
这样必须使用全称对里面的对象进行引用,如:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
还可以使用下面的语句来加载 echo
子模块:
from Sound.Effects import echo
它在没有包前缀的情况下也可以使用,所以它可以如下方式调用:
echo.echofilter(input, output, delay=0.7, atten=4)
不主张从一个包或模块中用 import *
导入所有模块,因为这样的通常会导致可读性很差。
from Package import specific_submodule
的用法并没有错,实际上这还是推荐的用法,除非导入的模块需要使用其它包中的同名子模块(the importing module needs to use submodules with the same name from different packages)。
综上所述,一般情况应该使用 import
,但有几个例外:
- module 文档告诉你要用
from-import
的。 - 导入一个包组件。需要一个包里面的某个子模块,一般用
from A.b import c
比import A.b.c
更方便且不会冒混淆的危险。
Python 中的import 机制
解释器在执行语句时,遵循作用域原则。因为这和作用域有关系,如果在顶层导入模块,此时它的作用域是全局的;如果在函数内部导入了模块,那它的作用域只是局部的,不能被其它函数使用。如果其它函数也要用到这个模块,还需要再次导入比较麻烦。
在用 import
语句导入模块时最好按照这样的顺序:
- 绝对路径:就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件。
- 相对路径:就是以当前文件为基准进行一级级目录指向被引用的资源文件。
以下是常用的表示当前目录和当前目录的父级目录的标识符:
形如
from moduleB import ClassB
语句,根据 Python 内部 import 机制,执行细分步骤: 总结:from moduleB import ClassB
有两个过程,先from module
,后import ClassB
。 当然将moduleA.py
语句from moduleB import ClassB
改为:
import moduleB
将在第二次执行 moduleB.py
语句 from moduleA import ClassA
时报错:
ImportError: cannot import name 'classA'
在一个文件下同时有 __init__.py
文件、和其他模块文件时,该文件夹即看作一个包(package)。包的导入和模块导入基本一致,只是导入包时,会执行这个 __init__.py
,而不是模块中的语句。
而且,如果只是单纯地导入包【形如:import xxx
】,而包的 __init__.py
中有没有明确地的其他初始化操作,则:此包下的模块是不会被自动导入的。当然该包是会成功导入的,并将包名称放入当前 .py
的 Local 命名空间中。
参考文章:
- Python 中 import 机制
- Python 3.x 可能是史上最详解的【导入(import)】
- 在 Python 中以绝对路径或者相对路径导入文件的方法
- Python 的模块引用和查找路径
如何在python3中正确导入同一目录下的模块
因为要 absolute_import
,这样 import webchat_sdk.basic
应该没问题了。
在 Python 2 里面可以使用 import foo
来导入相同目录包下的模块 foo
,在 Python 3 里面就是导入的项目根目录(最上层有 __init__.py
的目录)包 foo
。也就是说 Python 3 默认就是绝对导入的,import .foo
只是相对于绝对导入来说的,并不是相对导入。
python使用相对导入的具体意义?
除了让包内导入更加显式,这个功能的一部分设计初衷是,为了帮助脚本解决同名文件出现在模块搜索路径上多个不同位置时的二义性。
考虑包目录,这定义了一个名为 mypkg
的包,其中含有名为 mypkg.main
和 mypkg.string
的模块。现在,假设模块 main
试图导入名为 string
的模块。在 Python 2.X 和更早版本中,Python 会先寻找 mypkg
目录以执行相对导入。这会找到并导入位于该处的 string.py
文件,将其赋值给 mypkg.main
模块命名空间内的名称 string
。
不过,这一导入的本意可能是要导入 Python 标准库的 string
模块。可惜的是,在这些 Python 版本中,无法直接忽略 mypkg.string
去寻找位于模块搜索路径更右侧的标准库中的 string
模块。此外,我们无法使用完整包导入路径来解决这个问题,因为我们无法依赖在每台机器上的标准链接库路径。换句话说,包中的简单导入可能具有二义性而且容易出错。在包内,我们无法确定 import pam
语句指的是包内的模块还是包外的模块。
一种可能的后果是,一个局部的模块或包会在不经意间隐藏了 sys.path
上的另一个模块。
在实践中,Python 使用者可以避免为他们自己的模块重复使用标准库模块的名称(如果需要标准 string
库,就不要把新的模块命名为 string
)。但是,一个包还是有可能意外地隐藏标准库模块。再者,Python 以后可能新增标准库模块,而其名称可能刚好就和自己的一个模块同名。而依赖于没有点号开头相对导入的程序代码同样也不容易理解,因为读者可能对希望使用哪个模块而感到困惑。所以我们最好能在代码中显式地指出导入的解析过程。
python如何导入函数
Python 的内建函数即是 Python 自带的函数,这种函数不需要定义,并且不同的内建函数具有不同的功能,可以直接使用。 以下是部分内建函数用法及说明:
abs()
,返回数字的绝对值。all()
,如果集合中所有元素是 true 或集合为空集合,返回 True。any()
,如果集合中有一项元素是 true,返回 True;空集合为 False。ascii()
,返回一个表示对象的字符串。bin()
,将整数转换为前缀为"0b"
的二进制字符串。bool()
,返回一个布尔值,即 True 或者 False。bytearray()
,返回一个新的字节数组。callable(对象)
,判断对象参数是否可被调用(可被调用指的是对象能否使用()
括号的方法调用)。chr()
,返回表示 Unicode 代码点为整数 i 的字符的字符串。与ord()
函数相反。classmethod
,将方法转换为类方法。compile
,将源代码编译为代码或 AST 对象。source
可以是普通字符串,字节字符串或 AST 对象。dict()
,创建一个字典。divmod(a, b)
,将两个数作为参数,并在使用整数除法时返回由商和余数组成的一对数。enumerate(iterable, start=0)
。enumerate
是枚举、列举的意思。对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate
将其组成一个索引序列,利用它可以同时获得索引和值。enumerate
多用于在for
循环中得到计数。eval
,将一个字符串变为字典。exec(object [, globals[, locals]])
,exec
语句用来执行储存在字符串或文件中的 Python 语句。filter(function, iterable)
,filter
函数用于过滤序列。filter()
把传入的函数依次作用于每个元素,然后根据返回值是 True 还是 False 决定保留还是丢弃该元素。