摘要:概述最近在一個項(xiàng)目用,大量的使用的函數(shù),來執(zhí)行各式各樣的命令,隨之而來的,是各種坑。這個函數(shù)在源文件和目的文件在一個硬盤,不會有問題,但是當(dāng)不同磁盤間移動時,就會出問題,用官方的話說但是一旦成功,就是個原子操作,就是說,可命令一致了。
概述
最近在一個項(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兩個路徑都存在,并且path1的文件比較大,大家想想,這段代碼執(zhí)行會有問題嗎?具體問題表現(xiàn)是什么樣的。
再有一行代碼如下:
os.rename("cp path1 path2")
假設(shè)path1和path2都是存在的,這段代碼會有問題嗎?
你猜不到的答案第一行代碼,正常情況下不會有什么問題,可以一旦當(dāng)這個文件太大,就會引發(fā)OOM(out of memory)錯誤,導(dǎo)致cp那個命令執(zhí)行失敗,下面這句話畫重點(diǎn),這個錯誤不會拋異常、不會拋異常、不會拋異常。(重要的事情說三遍)
第二行代碼,正常情況下也不會有什么問題,可以當(dāng)你a b兩個目錄不在同一個磁盤或者是nfs這種共享目錄的話,就會導(dǎo)致a文件在move之后不會被刪除。
這是為什么了os.system 這個函數(shù)在linux環(huán)境下,只是封裝了c語言的system這個函數(shù),并且沒做任何修改,所以,system函數(shù)返回什么,os.system就返回什么,而正常c語言system這個函數(shù)是啟動的子進(jìn)程被殺是不會發(fā)生異常的。
os.rename 這個函數(shù)在源文件和目的文件在一個硬盤,不會有問題,但是當(dāng)不同磁盤間移動時,就會出問題,用官方的話說
The operation may fail on some Unix flavors if src and dst are on different filesystems
但是一旦成功,就是個原子操作,就是說,可mv命令一致了。
解決方案os.system 可以是用subprocess模塊代替
os.rename 使用shutil模塊代替,shutil提供了文件處理相關(guān)的函數(shù)
最后說一句os庫里的好多函數(shù)都已經(jīng)過期了,推薦大家在以后的編碼中,盡量不要使用os庫里的函數(shù),萬一掉進(jìn)去,都是巨深無比的坑。
點(diǎn)一下給你更多,你的點(diǎn)擊,將給我更多的分享動力。(其實(shí)就是的我博客太冷清了,慘)文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/45546.html
摘要:但如果對用戶的請求處理不恰當(dāng),就會造成嚴(yán)重的安全漏洞。經(jīng)過測試,的構(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)亮的技能。報錯包含了內(nèi)置命名空間中的名稱,在控制臺中輸入,就能發(fā)現(xiàn)很多內(nèi)置函數(shù)異常和其它屬性的名稱。 Python 提供了很多內(nèi)置的工具函數(shù)(Built-in Functions),在最新的 Python 3 官方文檔中,它列出了 69 個。 大部分函數(shù)是我們經(jīng)常使用的,例如 p...
摘要:中斷觸發(fā)系統(tǒng)將運(yùn)行時間由用戶態(tài)程序交還給內(nèi)核態(tài)的一種方式。終端終端偽終端會話信號發(fā)送給程序的來表示有重要事件發(fā)生的軟件中斷。系統(tǒng)收到信號后,會把時間交由內(nèi)核態(tài),然后再進(jìn)行退出程序,掛起,恢復(fù),或自定義操作。 目錄 1 背景姿勢 2 前戲 3 正餐 4 systemctl stop docker 5 demo 1 背景姿勢 驅(qū)動 驅(qū)動程序全稱設(shè)備驅(qū)動程序,是添加到操作系統(tǒng)中的特殊程...
摘要:基于網(wǎng),分享項(xiàng)目的組網(wǎng)架構(gòu)和部署。項(xiàng)目組網(wǎng)架構(gòu)架構(gòu)說明流項(xiàng)目訪問分為兩個流,通過分兩個端口暴露給外部使用數(shù)據(jù)流用戶訪問網(wǎng)站。通過進(jìn)行配置,使用作為異步隊(duì)列來存儲任務(wù),并將處理結(jié)果存儲在中。 基于Raindrop網(wǎng),分享項(xiàng)目的組網(wǎng)架構(gòu)和部署。 項(xiàng)目組網(wǎng)架構(gòu) showImg(https://cloud.githubusercontent.com/assets/7239657/1015704...
閱讀 4399·2021-11-18 13:19
閱讀 1225·2021-10-11 10:58
閱讀 3337·2019-08-29 16:39
閱讀 3196·2019-08-26 12:08
閱讀 2116·2019-08-26 11:33
閱讀 2517·2019-08-23 18:30
閱讀 1376·2019-08-23 18:21
閱讀 2575·2019-08-23 18:18