プログラミングを趣味にしたい

UE4、scala、ゲーム作り、webアプリ制作とか手を出しているPC系趣味について書き溜めるブログ。現在大規模改装中

このブログは現在リブート中です。 予告なく変更、削除、停止を行う場合があります。
回収作業が終わったらこの文章は削除します

pythonのwin環境での実行時、ファイル削除しようとするとパーミッションエラー。(またpythonで変に詰まったので備忘録)

win環境でpythonファイル操作でファイルを削除しようとしても、

PermissionError: [WinError 32] プロセスはファイルにアクセスできません。別のプロセスが使用中です。

って出るときがある(´;ω;`)

って泣いてたけど簡単に解決できたので備忘録。



経緯

前回
tec.citrussin.com


よし!これでファイルをリネームして位置を移せるようになったなぁ(*´∀`*)
と単純作業をpythonに任せるようにしてたのですが、ふと思いました。
「リネームして位置移した後の後始末も自動化しないと意味ねーよな・・・」
と。
んで
shutil.rmtree(Path(p))
を追加して、いらんようになったディレクトリを削除してたわけですよ。

んでも、面倒になって数十ディレクトリぐらいを一気に処理してたら

PermissionError: [WinError 32] プロセスはファイルにアクセスできません。別のプロセスが使用中です。

って出ました。

???!!!!(;・∀・)

アイエエエエ! パーミッションエラー!? パーミッションエラーナンデ!?

コワイ!(´;ω;`)
ってなりました。

原因

まぁwindowsちゃんって寂しんぼうなのか、握ったファイルなかなか離してくれないんですよねー。。。。。
使い終わったらさっさと離せや!!!(#・∀・)

・・・袖を掴んだ幼女が引っ張ってるようなものと考えて、平穏を取り戻し数秒。
とりあえず、起きていることとしては

Path(a).rename(Path(a).with_name(target)) 

で、Pathlibちゃんがファイルを握る。
 
・・・・
 

shutil.copy(Path(a) , Path(p).parent)

もしくは
shutil.rmtree(Path(p))
がファイルを握ろうとする
 
・・・・
 
しかし、pathlibがまだファイルを解放してないので、
pathlib「私の!あげない!」
 
shutil「(´;ω;`)」
shutil「ファイルにアクセスできません(´;ω;`)」

ってことですよね。
極々一般的な動作です。

基本的にはすぐに離してくれるんですが、何百ファイルを一気に処理してるとつまずくみたい。

解決

で、pythonってファイル解放待つのどうしたらいいんだろう?ってちょっと考えたんですけど。
これも極々一般的な方法で、

try - except(else) - finally

で、すぐ解決する問題でした。

try :
処理1
except :
エラー処理
else :
エラーが起きなかったときの処理
finally :
処理2

で、処理1が終わってから処理2を実行してくれるやつですね。
javaでいうtry - catch
ここ進研ゼミJAVAでやったところだ(*´∀`*)



try :
pathlibの処理
finally :
shutilの移動処理と削除処理
で解決。


追記:
エラー削除するんだからfinallyじゃなくてelseの方が良いのかもしれん(;・∀・)

try :
pathlibの処理
else :
shutilの移動処理と削除処理


今回は出会って一分で解決でした。良かった。

教訓

ファイル操作は副作用マシマシの操作なので、デッドロックや処理順番の誤作動には気をつけないといけないですよね。
久々に思い出しました。

っていうか、Cでmallocバチバチしてたときはこんなミスしたことなかったのに。
衰えている。確実に。
全ては甘やかしてくれるガーベジコレクタちゃんが悪いんや・・・・

IT業界から離れて早5年。
使わないと確実に腕が衰えていきますなぁorz

関連記事

ないよー