成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

慎用python os庫

0xE7A38A / 709人閱讀

摘要:概述最近在一個(gè)項(xiàng)目用,大量的使用的函數(shù),來執(zhí)行各式各樣的命令,隨之而來的,是各種坑。這個(gè)函數(shù)在源文件和目的文件在一個(gè)硬盤,不會(huì)有問題,但是當(dāng)不同磁盤間移動(dòng)時(shí),就會(huì)出問題,用官方的話說但是一旦成功,就是個(gè)原子操作,就是說,可命令一致了。

概述

最近在一個(gè)項(xiàng)目用,大量的使用的os.system函數(shù),來執(zhí)行各式各樣的shell命令,隨之而來的,是各種坑。

環(huán)境

python:2.7

os: centos6

問題復(fù)現(xiàn)

有一行代碼如下:

os.system("cp path1 path2")

假設(shè)path1和path2兩個(gè)路徑都存在,并且path1的文件比較大,大家想想,這段代碼執(zhí)行會(huì)有問題嗎?具體問題表現(xiàn)是什么樣的。

再有一行代碼如下:

os.rename("cp path1 path2")

假設(shè)path1和path2都是存在的,這段代碼會(huì)有問題嗎?

你猜不到的答案

第一行代碼,正常情況下不會(huì)有什么問題,可以一旦當(dāng)這個(gè)文件太大,就會(huì)引發(fā)OOM(out of memory)錯(cuò)誤,導(dǎo)致cp那個(gè)命令執(zhí)行失敗,下面這句話畫重點(diǎn),這個(gè)錯(cuò)誤不會(huì)拋異常、不會(huì)拋異常、不會(huì)拋異常。(重要的事情說三遍)

第二行代碼,正常情況下也不會(huì)有什么問題,可以當(dāng)你a b兩個(gè)目錄不在同一個(gè)磁盤或者是nfs這種共享目錄的話,就會(huì)導(dǎo)致a文件在move之后不會(huì)被刪除。

這是為什么了

os.system 這個(gè)函數(shù)在linux環(huán)境下,只是封裝了c語言的system這個(gè)函數(shù),并且沒做任何修改,所以,system函數(shù)返回什么,os.system就返回什么,而正常c語言system這個(gè)函數(shù)是啟動(dòng)的子進(jìn)程被殺是不會(huì)發(fā)生異常的。

os.rename 這個(gè)函數(shù)在源文件和目的文件在一個(gè)硬盤,不會(huì)有問題,但是當(dāng)不同磁盤間移動(dòng)時(shí),就會(huì)出問題,用官方的話說

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

但是一旦成功,就是個(gè)原子操作,就是說,可mv命令一致了。

解決方案

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

os.rename 使用shutil模塊代替,shutil提供了文件處理相關(guān)的函數(shù)

最后說一句

os庫里的好多函數(shù)都已經(jīng)過期了,推薦大家在以后的編碼中,盡量不要使用os庫里的函數(shù),萬一掉進(jìn)去,都是巨深無比的坑。

點(diǎn)一下給你更多,你的點(diǎn)擊,將給我更多的分享動(dòng)力。(其實(shí)就是的我博客太冷清了,慘)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/45546.html

相關(guān)文章

  • python 為什么說eval要慎用?使用eval 帶來的潛在風(fēng)險(xiǎn)?什么情況下使用eval?

    摘要:但如果對(duì)用戶的請(qǐng)求處理不恰當(dāng),就會(huì)造成嚴(yán)重的安全漏洞。經(jīng)過測(cè)試,的構(gòu)造函數(shù)是被解釋器沙箱隔離的。構(gòu)造完成后,調(diào)用函數(shù)即可觸發(fā),其思路不可謂不淫蕩。 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] 當(dāng)內(nèi)存中的內(nèi)置模塊含有...

    劉厚水 評(píng)論0 收藏0
  • 深度辨析 Python 的 eval() 與 exec()

    摘要:內(nèi)置函數(shù)們能夠被提拔出來,這就意味著它們皆有獨(dú)到之處,有用武之地。因此,掌握內(nèi)置函數(shù)的用法,就成了我們應(yīng)該點(diǎn)亮的技能。報(bào)錯(cuò)包含了內(nèi)置命名空間中的名稱,在控制臺(tái)中輸入,就能發(fā)現(xiàn)很多內(nèi)置函數(shù)異常和其它屬性的名稱。 Python 提供了很多內(nèi)置的工具函數(shù)(Built-in Functions),在最新的 Python 3 官方文檔中,它列出了 69 個(gè)。 大部分函數(shù)是我們經(jīng)常使用的,例如 p...

    AndroidTraveler 評(píng)論0 收藏0
  • Linux ctrl-c explained(ctrl-c 詳解)

    摘要:中斷觸發(fā)系統(tǒng)將運(yùn)行時(shí)間由用戶態(tài)程序交還給內(nèi)核態(tài)的一種方式。終端終端偽終端會(huì)話信號(hào)發(fā)送給程序的來表示有重要事件發(fā)生的軟件中斷。系統(tǒng)收到信號(hào)后,會(huì)把時(shí)間交由內(nèi)核態(tài),然后再進(jìn)行退出程序,掛起,恢復(fù),或自定義操作。 目錄 1 背景姿勢(shì) 2 前戲 3 正餐 4 systemctl stop docker 5 demo 1 背景姿勢(shì) 驅(qū)動(dòng) 驅(qū)動(dòng)程序全稱設(shè)備驅(qū)動(dòng)程序,是添加到操作系統(tǒng)中的特殊程...

    Me_Kun 評(píng)論0 收藏0
  • 基于Flask-Angular的項(xiàng)目組網(wǎng)架構(gòu)與部署

    摘要:基于網(wǎng),分享項(xiàng)目的組網(wǎng)架構(gòu)和部署。項(xiàng)目組網(wǎng)架構(gòu)架構(gòu)說明流項(xiàng)目訪問分為兩個(gè)流,通過分兩個(gè)端口暴露給外部使用數(shù)據(jù)流用戶訪問網(wǎng)站。通過進(jìn)行配置,使用作為異步隊(duì)列來存儲(chǔ)任務(wù),并將處理結(jié)果存儲(chǔ)在中。 基于Raindrop網(wǎng),分享項(xiàng)目的組網(wǎng)架構(gòu)和部署。 項(xiàng)目組網(wǎng)架構(gòu) showImg(https://cloud.githubusercontent.com/assets/7239657/1015704...

    kelvinlee 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

0xE7A38A

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<