摘要:概述最近在一個項目用,大量的使用的函數,來執行各式各樣的命令,隨之而來的,是各種坑。這個函數在源文件和目的文件在一個硬盤,不會有問題,但是當不同磁盤間移動時,就會出問題,用官方的話說但是一旦成功,就是個原子操作,就是說,可命令一致了。
概述
最近在一個項目用,大量的使用的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庫里的函數,萬一掉進去,都是巨深無比的坑。
點一下給你更多,你的點擊,將給我更多的分享動力。(其實就是的我博客太冷清了,慘)文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45546.html
摘要:但如果對用戶的請求處理不恰當,就會造成嚴重的安全漏洞。經過測試,的構造函數是被解釋器沙箱隔離的。構造完成后,調用函數即可觸發,其思路不可謂不淫蕩。 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] 當內存中的內置模塊含有...
摘要:內置函數們能夠被提拔出來,這就意味著它們皆有獨到之處,有用武之地。因此,掌握內置函數的用法,就成了我們應該點亮的技能。報錯包含了內置命名空間中的名稱,在控制臺中輸入,就能發現很多內置函數異常和其它屬性的名稱。 Python 提供了很多內置的工具函數(Built-in Functions),在最新的 Python 3 官方文檔中,它列出了 69 個。 大部分函數是我們經常使用的,例如 p...
摘要:中斷觸發系統將運行時間由用戶態程序交還給內核態的一種方式。終端終端偽終端會話信號發送給程序的來表示有重要事件發生的軟件中斷。系統收到信號后,會把時間交由內核態,然后再進行退出程序,掛起,恢復,或自定義操作。 目錄 1 背景姿勢 2 前戲 3 正餐 4 systemctl stop docker 5 demo 1 背景姿勢 驅動 驅動程序全稱設備驅動程序,是添加到操作系統中的特殊程...
摘要:基于網,分享項目的組網架構和部署。項目組網架構架構說明流項目訪問分為兩個流,通過分兩個端口暴露給外部使用數據流用戶訪問網站。通過進行配置,使用作為異步隊列來存儲任務,并將處理結果存儲在中。 基于Raindrop網,分享項目的組網架構和部署。 項目組網架構 showImg(https://cloud.githubusercontent.com/assets/7239657/1015704...
閱讀 3817·2021-11-18 13:19
閱讀 1169·2021-10-11 10:58
閱讀 3278·2019-08-29 16:39
閱讀 3130·2019-08-26 12:08
閱讀 2026·2019-08-26 11:33
閱讀 2453·2019-08-23 18:30
閱讀 1298·2019-08-23 18:21
閱讀 2515·2019-08-23 18:18