使用pycallgraph分析python代码函数调用流程以及框架解析

技术背景

在上一篇博客中,我们介绍了使用量子计算模拟器ProjectQ去生成一个随机数,也介绍了随机数的应用场景等。但是有些时候我们希望可以打开这里面实现的原理,去看看在产生随机数的过程中经历了哪些运算,调用了哪些模块。只有梳理清楚这些相关的内容,我们才能够更好的使用这个产生随机数的功能。这里我们就引入一个工具pycallgraph,可以根据执行的代码,给出这些代码背后所封装和调用的所有函数、类的关系图,让我们一起来了解下这个工具的安装和使用方法。

Manjaro Linux平台安装graphviz

首先用pip安装graphviz:

[dechin@dechin-manjaro callgraph]$ python3 -m pip install graphviz
Collecting graphviz
 Downloading graphviz-0.16-py2.py3-none-any.whl (19 kB)
Installing collected packages: graphviz
Successfully installed graphviz-0.16

然后再安装pycallgraph,这两者有先后的依赖关系:

[dechin@dechin-manjaro callgraph]$ python3 -m pip install pycallgraph
Collecting pycallgraph
 Downloading pycallgraph-1.0.1.tar.gz (36 kB)
Building wheels for collected packages: pycallgraph
 Building wheel for pycallgraph (setup.py) ... done
 Created wheel for pycallgraph: filename=pycallgraph-1.0.1-py3-none-any.whl size=35943 sha256=d0ee9415d7c268f6964f4a0fd1dc6ec3e039b6bedfe4844de6c1eb8fd0a61389
 Stored in directory: /home/dechin/.cache/pip/wheels/c1/6c/a0/22b61ff9ca89881bb8d030ecd019b84697a39e7b187bc57938
Successfully built pycallgraph
Installing collected packages: pycallgraph
Successfully installed pycallgraph-1.0.1

dot -v指令验证一下graphviz是否安装成功:

[dechin@dechin-manjaro callgraph]$ dot -v
bash: dot:未找到命令

咦?明明参考的正确方法,graphviz咋没有装上呢?经过面向谷歌的编程技术,发现了原来在系统上需要先安装一个graphviz,这里展示的是Manjaro Linux平台的安装方法:

[dechin-manjaro callgraph]# pacman -S graphviz
正在解析依赖关系...
正在查找软件包冲突...

软件包 (3) gts-0.7.6.121130-2 netpbm-10.73.33-1 graphviz-2.44.1-6

下载大小:  9.74 MiB
全部安装大小: 24.73 MiB

:: 进行安装吗? [Y/n] Y
:: 正在获取软件包......
 netpbm-10.73.33-1-x86_64      1867.1 KiB 6.51 MiB/s 00:00 [####################################] 100%
 gts-0.7.6.121130-2-x86_64      211.0 KiB 12.1 MiB/s 00:00 [####################################] 100%
错误:无法从 mirrors.ustc.edu.cn : The requested URL returned error: 404 获取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
错误:无法从 mirrors.tuna.tsinghua.edu.cn : The requested URL returned error: 404 获取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
错误:无法从 mirrors.huaweicloud.com : The requested URL returned error: 404 获取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
错误:无法从 mirrors.sjtug.sjtu.edu.cn : The requested URL returned error: 404 获取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
错误:无法从 mirrors.tuna.tsinghua.edu.cn : The requested URL returned error: 404 获取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
错误:无法从 mirrors.aliyun.com : The requested URL returned error: 404 获取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
警告:无法获取某些文件
错误:无法提交处理 (无法获取某些文件)
发生错误,没有软件包被更新。

咦?再一次遇到了问题,配置了这么多镜像源咋都安装不上?再经过一番面向谷歌的编程,发现更新一下源就可以用了:

[dechin-manjaro callgraph]# pacman -Syy
:: 正在同步软件包数据库...
 core                165.3 KiB 1968 KiB/s 00:00 [####################################] 100%
 extra               1987.0 KiB 9.11 MiB/s 00:00 [####################################] 100%
 community               6.6 MiB 9.93 MiB/s 00:01 [####################################] 100%
 multilib              181.4 KiB 12.7 MiB/s 00:00 [####################################] 100%
 archlinuxcn            1596.1 KiB 1232 KiB/s 00:01 [####################################] 100%

再次尝试安装graphviz:

[dechin-manjaro callgraph]# pacman -S graphviz
:: Some packages should be upgraded first...
正在解析依赖关系...
正在查找软件包冲突...

软件包 (2) archlinux-keyring-20210110-1 manjaro-system-20210217-1

下载大小: 0.95 MiB
全部安装大小: 1.31 MiB
净更新大小: 0.02 MiB

:: 进行安装吗? [Y/n] Y
:: 正在获取软件包......
 archlinux-keyring-20210110-1-any  950.2 KiB 4.96 MiB/s 00:00 [####################################] 100%
 manjaro-system-20210217-1-any    21.4 KiB 0.00  B/s 00:00 [####################################] 100%
(2/2) 正在检查密钥环里的密钥                   [####################################] 100%
(2/2) 正在检查软件包完整性                    [####################################] 100%
(2/2) 正在加载软件包文件                     [####################################] 100%
(2/2) 正在检查文件冲突                      [####################################] 100%
(2/2) 正在检查可用存储空间                    [####################################] 100%
:: 正在处理软件包的变化...
(1/2) 正在更新 archlinux-keyring                 [####################################] 100%
==> 正在从 archlinux.gpg 添加密匙...
gpg: 公钥 CF66D153D884358F 在其签名之后的 16 秒生成
==> 正在本地签名密匙环中的可信密匙...
 -> 正在本地签名密匙 AB19265E5D7D20687D303246BA1DFB64FFF979E7...
 -> 正在本地签名密匙 DDB867B92AA789C165EEFA799B729B06A680C281...
 -> 正在本地签名密匙 0E8B644079F599DFC1DDC3973348882F6AC6A4C2...
 -> 正在本地签名密匙 D8AFDDA07A5B6EDFA7D8CCDAD6D055F927843F1C...
 -> 正在本地签名密匙 91FFE0700E80619CEB73235CA88E23E377514E00...
==> 正在导入拥有者信任值...
==> 正在密匙环中禁用已激活密匙...
 -> 正在禁用密匙 4A8B17E20B88ACA61860009B5CED81B7C2E5C0D2...
 -> 正在禁用密匙 684148BB25B49E986A4944C55184252D824B18E8...
 -> 正在禁用密匙 5357F3B111688D88C1D88119FCF2CB179205AC90...
 -> 正在禁用密匙 50F33E2E5B0C3D900424ABE89BDCF497A4BBCC7F...
 -> 正在禁用密匙 39F880E50E49A4D11341E8F939E4F17F295AFBF4...
 -> 正在禁用密匙 F5A361A3A13554B85E57DDDAAF7EF7873CFD4BB6...
 -> 正在禁用密匙 40440DC037C05620984379A6761FAD69BA06C6A9...
 -> 正在禁用密匙 FB871F0131FEA4FB5A9192B4C8880A6406361833...
 -> 正在禁用密匙 487EACC08557AD082088DABA1EB2638FF56C0C53...
 -> 正在禁用密匙 76B4192E902C0A52642C63C273B8ED52F1D357C1...
 -> 正在禁用密匙 40776A5221EF5AD468A4906D42A1DB15EC133BAD...
 -> 正在禁用密匙 0B20CA1931F5DA3A70D0F8D2EA6836E1AB441196...
 -> 正在禁用密匙 07DFD3A0BC213FA12EDC217559B3122E2FA915EC...
 -> 正在禁用密匙 34C5D94FE7E7913E86DC427E7FB1A3800C84C0A5...
 -> 正在禁用密匙 B1F2C889CB2CCB2ADA36D963097D629E437520BD...
 -> 正在禁用密匙 D4DE5ABDE2A7287644EAC7E36D1A9E70E19DAA50...
 -> 正在禁用密匙 44D4A033AC140143927397D47EFD567D4C7EA887...
 -> 正在禁用密匙 8F76BEEA0289F9E1D3E229C05F946DED983D4366...
 -> 正在禁用密匙 27FFC4769E19F096D41D9265A04F9397CDFD6BB0...
 -> 正在禁用密匙 4FCF887689C41B09506BE8D5F3E1D5C5D30DB0AD...
 -> 正在禁用密匙 5A2257D19FF7E1E0E415968CE62F853100F0D0F0...
 -> 正在禁用密匙 7FA647CD89891DEDC060287BB9113D1ED21E1A55...
 -> 正在禁用密匙 5E7585ADFF106BFFBBA319DC654B877A0864983E...
 -> 正在禁用密匙 E7210A59715F6940CF9A4E36A001876699AD6E84...
 -> 正在禁用密匙 5559BC1A32B8F76B3FCCD9555FA5E5544F010D48...
 -> 正在禁用密匙 BFA1ECFEF1524EE4099CDE971F0CD4921ECAA030...
 -> 正在禁用密匙 4D913AECD81726D9A6C74F0ADA6426DD215B37AD...
 -> 正在禁用密匙 8840BD07FC24CB7CE394A07CCF7037A4F27FB7DA...
 -> 正在禁用密匙 BC1FBE4D2826A0B51E47ED62E2539214C6C11350...
 -> 正在禁用密匙 9515D8A8EAB88E49BB65EDBCE6B456CAF15447D5...
 -> 正在禁用密匙 779CD2942629B7FA04AB8F172E89012331361F01...
 -> 正在禁用密匙 D921CABED130A5690EF1896E81AF739EC0711BF1...
 -> 正在禁用密匙 5696C003B0854206450C8E5BE613C09CB4440678...
 -> 正在禁用密匙 8CF934E339CAD8ABF342E822E711306E3C4F88BC...
 -> 正在禁用密匙 1A60DC44245D06FEF90623D6EEEEE2EEEE2EEEEE...
 -> 正在禁用密匙 81D7F8241DB38BC759C80FCE3A726C6170E80477...
 -> 正在禁用密匙 63F395DE2D6398BBE458F281F2DBB4931985A992...
 -> 正在禁用密匙 65EEFE022108E2B708CBFCF7F9E712E59AF5F22A...
 -> 正在禁用密匙 66BD74A036D522F51DD70A3C7F2A16726521E06D...
==> 正在更新可信数据库...
gpg: 下次信任度数据库检查将于 2021-03-06 进行
(2/2) 正在更新 manjaro-system                  [####################################] 100%
:: 正在运行事务后钩子函数...
(1/1) Arming ConditionNeedsUpdate...

正在解析依赖关系...
正在查找软件包冲突...

软件包 (3) gts-0.7.6.121130-2 netpbm-10.73.33-1 graphviz-2.46.0-1

下载大小:  6.80 MiB
全部安装大小: 23.32 MiB

:: 进行安装吗? [Y/n] Y
:: 正在获取软件包......
 graphviz-2.46.0-1-x86_64       6.8 MiB 7.03 MiB/s 00:01 [####################################] 100%
(3/3) 正在检查密钥环里的密钥                   [####################################] 100%
(3/3) 正在检查软件包完整性                    [####################################] 100%
(3/3) 正在加载软件包文件                     [####################################] 100%
(3/3) 正在检查文件冲突                      [####################################] 100%
(3/3) 正在检查可用存储空间                    [####################################] 100%
:: 正在处理软件包的变化...
(1/3) 正在安装 netpbm                      [####################################] 100%
(2/3) 正在安装 gts                        [####################################] 100%
(3/3) 正在安装 graphviz                     [####################################] 100%
graphviz 的可选依赖
  mono: sharp bindings
  guile: guile bindings
  lua: lua bindings
  ocaml: ocaml bindings
  perl: perl bindings [已安装]
  python: python bindings [已安装]
  r: r bindings
  tcl: tcl bindings [已安装]
  qt5-base: gvedit [已安装]
  gtk2: gtk output plugin [已安装]
  xterm: vimdot
:: 正在运行事务后钩子函数...
(1/2) Arming ConditionNeedsUpdate...
(2/2) Warn about old perl modules

Finally还是给我安装成功了,接下来再看看dot指令的执行情况:

[dechin-manjaro callgraph]# dot -v
dot - graphviz version 2.46.0 (0)
libdir = "/usr/lib/graphviz"
Activated plugin library: libgvplugin_dot_layout.so.6
Using layout: dot:dot_layout
Activated plugin library: libgvplugin_core.so.6
Using render: dot:core
Using device: dot:dot:core
The plugin configuration file:
    /usr/lib/graphviz/config6
        was successfully loaded.
  render   : cairo dot dot_json fig gd json json0 map mp pic pov ps svg tk visio vml vrml xdot xdot_json
  layout   : circo dot fdp neato nop nop1 nop2 osage patchwork sfdp twopi
  textlayout : textlayout
  device   : bmp canon cmap cmapx cmapx_np dot dot_json eps fig gd gd2 gif gtk gv ico imap imap_np ismap jpe jpeg jpg json json0 mp pdf pic plain plain-ext png pov ps ps2 svg svgz tif tiff tk vdx vml vmlz vrml wbmp webp x11 xdot xdot1.2 xdot1.4 xdot_json xlib
  loadimage  : (lib) bmp eps gd gd2 gif ico jpe jpeg jpg png ps svg webp xbm

运行示例

这里我们以上一篇博客量子计算模拟器生成随机数中的案例,来测试一下pycallgraph的功能。源代码可以参考源博客地址,这里我们直接展示下更改后的代码:

# random_number.py
from projectq import MainEngine
from projectq.ops import H, Measure
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput

def random_number_generator():
  eng = MainEngine()
  qubit = eng.allocate_qubit()
  H | qubit
  eng.flush()
  Measure | qubit
  random_number = int(qubit)
  eng.flush(deallocate_qubits=True)
  return random_number

if __name__ == '__main__':
  graphviz = GraphvizOutput()
  graphviz.output_file = 'random_number_generator.png'
  with PyCallGraph(output=graphviz):
    random_number = random_number_generator()
    print('Random number generated by quantum simulator is:\
        {}'.format(random_number))

其实pycallgraph的使用方法也非常的简单,只需要导入PyCallGraphGraphvizOutput两个模块,然后把main函数中所有需要运行的正常流程的代码,放到with PyCallGraph(output=graphviz)里面即可。接下来运行该文件:

[dechin@dechin-manjaro callgraph]$ python3 random_number.py
Random number generated by quantum simulator is:        0

除了打印输出,我们会发现在当前目录下生成了一个名为random_number_generator.png的图形文件,具体内容打开如下图所示:

补充示例

考虑到上面的运行示例结果比较庞大,这也是一个稍微大一些的软件项目所面临的重大困难。这里为了简明的展示pycallgraph的功能,我们再额外补充一个简单的示例:

# simple_calculation.py
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput

def multiply(a, b):
  return a*b

def plus(a, b):
  return a+b

if __name__ == '__main__':
  graphviz = GraphvizOutput()
  graphviz.output_file = 'simple_calculation.png'
  with PyCallGraph(output=graphviz):
    a = 10
    b = 2
    print ('The value of a*b+b is: {}'.format(plus(multiply(a, b), b)))

这个案例的功能,仅仅是把加法和乘法进行了函数的封装,再在main函数中调用,执行结果和pycallgraph生成的图片如下图所示:

[dechin@dechin-manjaro callgraph]$ python3 simple_calculation.py
The value of a*b+b is: 22

在这个示例中,我们就可以很清晰的看到这个执行的文件的调用关系,其实就只是调用了multiplyplus两个函数而已。

总结概要

使用pycallgraph这个工具,可以帮助我们更好的入手去分析一个全新的软件包。通过了解各个模块之间的调用关系,我们还可以比较直观的梳理出相关的架构图,带着架构的思维去逐层的分析相应的软件及其实现的方式。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/pycallgraph.html
作者ID:DechinPhy
更多原著文章请参考:https://www.cnblogs.com/dechinphy/

到此这篇关于使用pycallgraph分析python代码函数调用流程以及框架解析的文章就介绍到这了,更多相关python代码函数调用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python flask框架详解

    Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务.本文参考自Flask官方文档, 英文不好的同学也可以参考中文文档 1.安装flask pip install flask 2.简单上手 一个最小的 Flask 应用如下: from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World' if __na

  • 解决python 出现unknown encoding: idna 的问题

    这个问题是编码的问题在开头导入个包就行了,简答粗暴 import encodings.idna 补充:执行Python出现LookupError: unknown encoding: cp65001解决办法 在执行fetch v8时出现 E:\GitProject\svn_v8>fetch v8 Running: 'E:\GitProject\libcef\depot_tools\python276_bin\python.exe' 'E:\GitProj ect\libcef\depot_too

  • python docx的超链接网址和链接文本操作

    我就废话不多说了,大家还是直接看代码吧~ from docx import Document from docx import RT import re d=Document("./liu2.docx") for p in d.paragraphs: rels = d.part.rels for rel in rels: if rels[rel].reltype == RT.HYPERLINK: print("\n 超链接文本为", rels[rel], "

  • python encode和decode的妙用

    >>> "hello".encode("hex") '68656c6c6f' 相应的还可以 >>> '68656c6c6f'.decode("hex") 'hello' 查了一下手册,还有这些codec可用 Codec Aliases Operand type Purpose base64_codec base64, base-64 byte string Convert operand to MIME bas

  • Python中docx2txt库的使用说明

    docx2txt的Github地址 docx2txt是基于python的从docx文件中提取文本和图片的库. 代码是从python-docx中获取的.它也可以从页眉,页脚和超链接中提取文本.它现在也可以提取图像. 安装 pip install docx2txt 运行 1.命令行运行 # extract text docx2txt file.docx # extract text and images docx2txt -i /tmp/img_dir file.docx 2.在python中调用

  • 使用python模块plotdigitizer抠取论文图片中的数据实例详解

    技术背景 对于各行各业的研究人员来说,经常会面临这样的一个问题:有一篇不错的文章里面有很好的数据,但是这个数据在文章中仅以图片的形式出现.而假如我们希望可以从该图片中提取出数据,这样就可以用我们自己的形式重新来展现这些数据,还可以额外再附上自己优化后的数据.因此从论文图片中提取数据,是一个非常实际的需求.这里以前面写的量子退火的博客为例,博客中有这样的一张图片: 在这篇文章中,我们将介绍如何使用python从图片上把数据抠取出来. plotdigitizer的安装 这里我们使用pip来安装pyt

  • 使用pycallgraph分析python代码函数调用流程以及框架解析

    技术背景 在上一篇博客中,我们介绍了使用量子计算模拟器ProjectQ去生成一个随机数,也介绍了随机数的应用场景等.但是有些时候我们希望可以打开这里面实现的原理,去看看在产生随机数的过程中经历了哪些运算,调用了哪些模块.只有梳理清楚这些相关的内容,我们才能够更好的使用这个产生随机数的功能.这里我们就引入一个工具pycallgraph,可以根据执行的代码,给出这些代码背后所封装和调用的所有函数.类的关系图,让我们一起来了解下这个工具的安装和使用方法. Manjaro Linux平台安装graphv

  • 使用70行Python代码实现一个递归下降解析器的教程

     第一步:标记化 处理表达式的第一步就是将其转化为包含一个个独立符号的列表.这一步很简单,且不是本文的重点,因此在此处我省略了很多. 首先,我定义了一些标记(数字不在此中,它们是默认的标记)和一个标记类型: token_map = {'+':'ADD', '-':'ADD', '*':'MUL', '/':'MUL', '(':'LPAR', ')':'RPAR'} Token = namedtuple('Token', ['name', 'value']) 下面就是我用来标记 `expr` 表

  • Python 代码性能优化技巧分享

    如何进行 Python 性能优化,是本文探讨的主要问题.本文会涉及常见的代码优化方法,性能优化工具的使用以及如何诊断代码的性能瓶颈等内容,希望可以给 Python 开发人员一定的参考. Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 80% 的工作量.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率. 改进算法,选择合适的数据结构 一个

  • python代码检查工具pylint 让你的python更规范

    1.pylint是什么? Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅参考资料)和有潜在问题的代码.目前 Pylint 的最新版本是 pylint-0.18.1. Pylint 是一个 Python 工具,除了平常代码分析工具的作用之外,它提供了更多的功能:如检查一行代码的长度,变量名是否符合命名标准,一个声明过的接口是否被真正实现等等. Pylint 的一个很大的好

  • 如何使用 Pylint 来规范 Python 代码风格(来自IBM)

    Pylint 是什么 Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅参考资料)和有潜在问题的代码.目前 Pylint 的最新版本是 pylint-0.18.1. Pylint 是一个 Python 工具,除了平常代码分析工具的作用之外,它提供了更多的功能:如检查一行代码的长度,变量名是否符合命名标准,一个声明过的接口是否被真正实现等等. Pylint 的一个很大的好处是

  • Python导出并分析聊天记录详解流程

    导出聊天记录生成词云看看你和对象聊了什么(可惜我没女朋友) 1.导出聊天记录打开消息管理器 导出的格式选择txt格式(我这里选择导出的路径是桌面所以在桌面上生成了一个包含聊天记录的.txt文件) 2.编写代码图中框出来的文本是我们不需要的(比如说图片会在这里面显示为[图片]表情显示为[表情]) 所以我们把它替换掉,我这里用到了正则: string = open(r'C:\\Users\\l1768\\Desktop\\消息记录.txt','r',encoding='utf-8').read()

  • 分析Python的Django框架的运行方式及处理流程

    之前在网上看过一些介绍Django处理请求的流程和Django源码结构的文章,觉得了解一下这些内容对开发Django项目还是很有帮助的.所以,我按照自己的逻辑总结了一下Django项目的运行方式和对Request的基本处理流程. 一.Django的运行方式 运行Django项目的方法很多,这里主要介绍一下常用的方法.一种是在开发和调试中经常用到runserver方法,使用Django自己的web server:另外一种就是使用fastcgi,uWSGIt等协议运行Django项目,这里以uWSG

  • Python之reload流程实例代码解析

    本文研究的主要是Python之reload流程的相关内容,具体如下. 在Python中,reload() 用于重新载入之前载入的模块. reload() 函数语法: reload(module) Python中 import 只执行一次,后续的 import 仅仅在 sys.modules 中查找是否存在对应的模块对象,而对于源文件进行修改后想要立即重新导入该文件而不想整体重新执行程序时, reload 就在该处派上用途了.在实际中,测试代码修改结果,或者对于不能停止的服务需要动态改变运行行为

  • 使用bandit对目标python代码进行安全函数扫描的案例分析

    技术背景 在一些对python开源库代码的安全扫描中,我们有可能需要分析库中所使用到的函数是否会对代码的执行环境造成一些非预期的影响.典型的例如python的沙箱逃逸问题,通过一些python的第三方库可以执行系统shell命令,而这就不在python的沙箱防护范围之内了.关于python的沙箱逃逸问题,这里不作展开,这也是困扰业界多年的一个问题,连python官方也提过python的沙箱是没有完美的防护方案的,这里仅作为一个背景案例使用: # subprocess_Popen.py impor

  • python代码实现小程序登录流程时序总结

    目录 官方文档 小程序登录 登录流程时序 说明: 注意: 小程序的登录总结 案例 官方文档 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 小程序登录 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系. 登录流程时序 说明: 调用wx.login()获取临时登录凭证code,并回传到开发者服务器. 调用auth.code2Sessi

随机推荐