Python跨文件执行代码

利用import机制跨文件执行代码


实例

实现起来很简单
一张图即可看出发生了什么

现象

根据图可以很明确的知道在执行c014.py时
re.py和struct.py被编译成pyc且被执行了
而binascii.py test.py没有被编译执行
且在py文件被删除后无法执行pyc

解释之前

解释之前先简单说说python中的import的流程
和pyc文件

python import流程

通过实践来说明

可以发现import是先在当前工作目录下查找
若是当前目录下不存在则再到标准库目录查找
一旦找到则直接执行了该文件

pyc文件

pyc文件是py文件编译后产生的二进制文件,加载速度快于py文件
在import py文件时,会产生一个pyc文件以便于下次快速加载
(可以到自己的标准库目录下发现很多的pyc文件)

解释现象

从头分析
文件内容分别为

1
2
3
4
5
binascii.py -> print("binascii")
c014.py -> import base64
re.py -> print("re")
struct.py -> print("struct")
test.py -> print("test")

python用的多的同学可以看出这些py文件名好像大多都是模块的样子

当运行c014.py时
明明是import base64
struct.py和re.py却同时被执行

我们查看一下python3.5的base64.py源码
第一时间会发现

没错,这和我们部分的文件名一样

这里应该是c014.py在import base64模块时
触发了base64.py中的import re和import struct
这里并没有直接在标准库中查找,而是直接在c014.py目录下查询,导致了struct和re的输出

那么为什么binascii为什么没有被执行呢?
因为binascii在python中算是调用了一个对象文件
在如图所示的位置

就算直接在python文件中调用也不会再当前目录下查询
如图

其他疑点

我在python2.7测试时,仍然有一些不太清楚的地方,希望与大家一起探讨
疑点在于

这里只执行了struct.py和string.py
且这里在py文件被删除后仍然可以执行pyc
而python2.7标准库中的base64.py是这样

这里binascii好解释,因为同样也是被预先定义好的

但是re.py未能被执行我却无法理解

文章目录
  1. 1. 实例
  2. 2. 现象
  3. 3. 解释之前
    1. 3.1. python import流程
    2. 3.2. pyc文件
  4. 4. 解释现象
  5. 5. 其他疑点