Python奇怪的功能:“自爆”?


最近在逛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的这一特性在诸如下载或一些的特定要求下十分便利,但是如果使用不当,造成的后果难以想象,因此做好文件备份和权限保护是十分重要的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Day(AKA Elin)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值