摘要:概述最近在一個(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
摘要:但如果對(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)置模塊含有...
摘要:內(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...
摘要:中斷觸發(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)中的特殊程...
摘要:基于網(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...
閱讀 3926·2021-11-18 13:19
閱讀 1179·2021-10-11 10:58
閱讀 3291·2019-08-29 16:39
閱讀 3140·2019-08-26 12:08
閱讀 2035·2019-08-26 11:33
閱讀 2460·2019-08-23 18:30
閱讀 1308·2019-08-23 18:21
閱讀 2522·2019-08-23 18:18