最近在逛B站的时候无意发现有人说Python是一门会“自爆”的语言。
在好奇心驱使的,我打开了博主的视频一看,他使用了os模块下的remove()函数,并结合__file__会传递当前脚本具体在物理磁盘上的完整路径这一特征。顺理成章的把正在运行的脚本“自顾自的”给删除了?
说实话我是不想信Python会这么魔幻,自己运行自己,最终还能了结自己,这不很扯淡吗?
因此我也试一下,来验证一下这个所谓的“自爆”特性到底是不是真的。
首先我们先来看下当前的文件结构
(base) [root@ElinsLaptop:~/weriedPlace]# ls
(base) [root@ElinsLaptop:~/weriedPlace]# touch test.py
(base) [root@ElinsLaptop:~/weriedPlace]# ls -al
total 8
drwxr-xr-x 2 root root 4096 Jun 13 13:41 .
dr-xr-x--- 26 root root 4096 Jun 13 13:30 ..
-rw-r--r-- 1 root root 0 Jun 13 13:41 test.py
(base) [root@ElinsLaptop:~/weriedPlace]#
可以看到,我们现在的目录里只有test.py
这一个文件,并没有任何其他的文件,而且因为我没有写入任何内容的原因,导致test.py
的大小是0Byte。
那么,我们现在用vim来写点东西进去。
import time
import os
for i in range(5):
print(f"还有{5-i}秒我就消失了")
time.sleep(1)
if i == 4:
print("再见了")
os.remove(__file__)
(base) [root@ElinsLaptop:~/weriedPlace]# ls -al
total 24
drwxr-xr-x 2 root root 4096 Jun 13 13:46 .
dr-xr-x--- 26 root root 4096 Jun 13 13:46 ..
-rw-r--r-- 1 root root 12288 Jun 13 13:43 .test.py.swp
-rwxr-xr-x 1 root root 171 Jun 13 13:46 test.py
(base) [root@ElinsLaptop:~/weriedPlace]#
可以看到,我们写好了脚本,那么我们现在就来运行一下脚本
python test.py
(base) [root@ElinsLaptop:~/weriedPlace]# python test.py
还有5秒我就消失了
还有4秒我就消失了
还有3秒我就消失了
还有2秒我就消失了
还有1秒我就消失了
再见了
(base) [root@ElinsLaptop:~/weriedPlace]# ls -al
total 20
drwxr-xr-x 2 root root 4096 Jun 13 13:51 .
dr-xr-x--- 26 root root 4096 Jun 13 13:50 ..
-rw-r--r-- 1 root root 12288 Jun 13 13:43 .test.py.swp
(base) [root@ElinsLaptop:~/weriedPlace]#
可以看到,除了剩下的.test.py.swap
这一内存交换文件被保留了下来外,原本的test.py
已经被“自己删除”了!
对!它确实物理意义上的从这个磁盘上消失了!
那么这么设计的原因是为什么呢?
想象一个最经典的场景:下载器
当文件完成下载后,用户第一逻辑肯定想着去对下载好的文件进行操作对吧?你说谁下个文件下完了会去反过头来思考文件怎么下的呢?
这个时候你可以通过os.remove(__file__)
这一特性来对下载器进行一个自动销毁。
还是不能理解?那我来写一个实例来给你解释下:
这里我新建一个downloadConda.py
来编写一个下载Anaconda的下载器。
import os
from wget import download
download('https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh')
if os.path.exists('Anaconda3-2022.05-Linux-x86_64.sh'):
print('下载完成,下载器已自动销毁!')
os.remove(__file__)
可以看到,我这里调用wget模块下的download函数对Anaconda源站进行请求并下载安装脚本。
当Python检测到文件下载完时,则自动将下载器销毁
(base) [root@ElinsLaptop:~/weriedPlace]# python downloadConda.py
开始下载Conda
100% [......................................................................] 690850711 / 690850711下载完成,下载器已自
动销毁!
(base) [root@ElinsLaptop:~/weriedPlace]# ls
Anaconda3-2022.05-Linux-x86_64.sh
(base) [root@ElinsLaptop:~/weriedPlace]#
可以看到,在Conda下载完后,downloadConda.py
自动将自己销毁了。
总结
Python的这一特性在诸如下载或一些的特定要求下十分便利,但是如果使用不当,造成的后果难以想象,因此做好文件备份和权限保护是十分重要的。