资讯专栏INFORMATION COLUMN

慎用python os库

0xE7A38A / 514人阅读

摘要:概述最近在一个项目用,大量的使用的函数,来执行各式各样的命令,随之而来的,是各种坑。这个函数在源文件和目的文件在一个硬盘,不会有问题,但是当不同磁盘间移动时,就会出问题,用官方的话说但是一旦成功,就是个原子操作,就是说,可命令一致了。

概述

最近在一个项目用,大量的使用的os.system函数,来执行各式各样的shell命令,随之而来的,是各种坑。

环境

python:2.7

os: centos6

问题复现

有一行代码如下:

os.system("cp path1 path2")

假设path1和path2两个路径都存在,并且path1的文件比较大,大家想想,这段代码执行会有问题吗?具体问题表现是什么样的。

再有一行代码如下:

os.rename("cp path1 path2")

假设path1和path2都是存在的,这段代码会有问题吗?

你猜不到的答案

第一行代码,正常情况下不会有什么问题,可以一旦当这个文件太大,就会引发OOM(out of memory)错误,导致cp那个命令执行失败,下面这句话画重点,这个错误不会抛异常、不会抛异常、不会抛异常。(重要的事情说三遍)

第二行代码,正常情况下也不会有什么问题,可以当你a b两个目录不在同一个磁盘或者是nfs这种共享目录的话,就会导致a文件在move之后不会被删除。

这是为什么了

os.system 这个函数在linux环境下,只是封装了c语言的system这个函数,并且没做任何修改,所以,system函数返回什么,os.system就返回什么,而正常c语言system这个函数是启动的子进程被杀是不会发生异常的。

os.rename 这个函数在源文件和目的文件在一个硬盘,不会有问题,但是当不同磁盘间移动时,就会出问题,用官方的话说

  The operation may fail on some Unix flavors if src and dst are on different filesystems

但是一旦成功,就是个原子操作,就是说,可mv命令一致了。

解决方案

os.system 可以是用subprocess模块代替

os.rename 使用shutil模块代替,shutil提供了文件处理相关的函数

最后说一句

os库里的好多函数都已经过期了,推荐大家在以后的编码中,尽量不要使用os库里的函数,万一掉进去,都是巨深无比的坑。

点一下给你更多,你的点击,将给我更多的分享动力。(其实就是的我博客太冷清了,惨)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45546.html

相关文章

  • python 为什么说eval要慎用?使用eval 带来的潜在风险?什么情况下使用eval?

    摘要:但如果对用户的请求处理不恰当,就会造成严重的安全漏洞。经过测试,的构造函数是被解释器沙箱隔离的。构造完成后,调用函数即可触发,其思路不可谓不淫荡。 eval前言 In [1]: eval(2+3) Out[1]: 5 In [2]: eval([x for x in range(9)]) Out[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8] 当内存中的内置模块含有...

    刘厚水 评论0 收藏0
  • 深度辨析 Python 的 eval() 与 exec()

    摘要:内置函数们能够被提拔出来,这就意味着它们皆有独到之处,有用武之地。因此,掌握内置函数的用法,就成了我们应该点亮的技能。报错包含了内置命名空间中的名称,在控制台中输入,就能发现很多内置函数异常和其它属性的名称。 Python 提供了很多内置的工具函数(Built-in Functions),在最新的 Python 3 官方文档中,它列出了 69 个。 大部分函数是我们经常使用的,例如 p...

    AndroidTraveler 评论0 收藏0
  • Linux ctrl-c explained(ctrl-c 详解)

    摘要:中断触发系统将运行时间由用户态程序交还给内核态的一种方式。终端终端伪终端会话信号发送给程序的来表示有重要事件发生的软件中断。系统收到信号后,会把时间交由内核态,然后再进行退出程序,挂起,恢复,或自定义操作。 目录 1 背景姿势 2 前戏 3 正餐 4 systemctl stop docker 5 demo 1 背景姿势 驱动 驱动程序全称设备驱动程序,是添加到操作系统中的特殊程...

    Genng 评论0 收藏0
  • Linux ctrl-c explained(ctrl-c 详解)

    摘要:中断触发系统将运行时间由用户态程序交还给内核态的一种方式。终端终端伪终端会话信号发送给程序的来表示有重要事件发生的软件中断。系统收到信号后,会把时间交由内核态,然后再进行退出程序,挂起,恢复,或自定义操作。 目录 1 背景姿势 2 前戏 3 正餐 4 systemctl stop docker 5 demo 1 背景姿势 驱动 驱动程序全称设备驱动程序,是添加到操作系统中的特殊程...

    Me_Kun 评论0 收藏0
  • 基于Flask-Angular的项目组网架构与部署

    摘要:基于网,分享项目的组网架构和部署。项目组网架构架构说明流项目访问分为两个流,通过分两个端口暴露给外部使用数据流用户访问网站。通过进行配置,使用作为异步队列来存储任务,并将处理结果存储在中。 基于Raindrop网,分享项目的组网架构和部署。 项目组网架构 showImg(https://cloud.githubusercontent.com/assets/7239657/1015704...

    kelvinlee 评论0 收藏0

发表评论

0条评论

0xE7A38A

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<