你猜不到的答案
- 第一行代碼,正常情況下不會有什么問題,可以一旦當這個文件太大,就會引發(fā)OOM(out of memory)錯誤,導致cp那個命令執(zhí)行失敗,下面這句話畫重點,這個錯誤不會拋異常、不會拋異常、不會拋異常。(重要的事情說三遍)
- 第二行代碼,正常情況下也不會有什么問題,可以當你a b兩個目錄不在同一個磁盤或者是nfs這種共享目錄的話,就會導致a文件在move之后不會被刪除。
這是為什么了
os.system 這個函數(shù)在linux環(huán)境下,只是封裝了c語言的system這個函數(shù),并且沒做任何修改,所以,system函數(shù)返回什么,os.system就返回什么,而正常c語言system這個函數(shù)是啟動的子進程被殺是不會發(fā)生異常的。
-
os.rename 這個函數(shù)在源文件和目的文件在一個硬盤,不會有問題,但是當不同磁盤間移動時,就會出問題,用官方的話說
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ù),萬一掉進去,都是巨深無比的坑。