Python 3.9でファイルをオープンしているかどうかを確認する。

ファイルがオープンされているかどうかを確認してから処理を行う Python スクリプトがあるのですが、どうも Windows 10 20H2 (ビルド19042.685)のあたりから API が変わったのかうまく識別できないようになりました。
これまで判定していたのは以下のようなコードで、Google で検索してもこれがあがってきます。
try:
    open(filename, "a+")
Except IOError:
    print("cannot open ", filename)
実際には処理したいファイルをワイルドカードでリストを用いて、
for f in files:
    try:
        open(f, "a+")
    Except IOError:
        print("cannot open ", f)
のような形で使用しますが、オープンされているファイルが上手く処理されなくなりました。

それだと困ったことになるので、その識別部分を以下のように変えて対応しました。

from os import rename

open_check = 'unique filename'
for f in files:
    try:
        rename(f, open_check)
        rename(open_check, f)
    Except OSError:
        print("cannot open ", f)
こちらのほうだときちんと識別してくれるようになりました。

変数 open_check のユニークなファイル名として mkstemp() を使うと、リストの読み込みがなぜか一つおきになってしまいうまくいかなかったので、固定にしてみました。もしかしたら mkstemp() が返すのはフルパス名なので、 os.path.basename() でファイル名部分だけを切り出して使えばいいのかもしれませんが、一応用は足りたのでこれでいくことにします。

Windowsでシンボリックリンクを試してみる。

きっかけは、1つのファイルを別の名前で起動したら違う動きになるようなスクリプトを書く、でした。  busybox なんかでは、同じ実行形式ファイルの名前を、lsにすればlsと同じ、cpとすればcpと同じ動作をするようにしてますが、Pythonスクリプトでそれと同じように argv...