【Python】fcntl.flockをwindows含めてマルチプラットフォームに使う方法

Pythonのfcntl.flockについて

これはWindowsでは使えないことになってます。

使えたとしてもDockerが必須条件みたいです。

ただ僕はDockerを使ってません。
でも排他的ファイルロックが必要でした。

その回避策というか方法についてまとめます。

Windowsでは No module named 'fcntl' エラーが出る

例えばこういうコードを書いてみたとします。

▼ fcntl.flockによる多重プロセス禁止のコード

▼ このようなエラーが出てしまう...

システム的な問題なので仕方ない

Pythonはともかく、PHPなどではflockはマルチプラットでWindowsでも使えるんですよね。それと同じ感覚で使えると思ってたから困りました。(参考記事  : PHPスクリプトの多重起動を防止するには【flockによる方法】

portalocker.pyというスクリプトを使ってみた

同じように悩んでいる人は多いみたいです。

そこでこんなスクリプトを配布してる記事を見つけます。

ただPython2なのでPython3では修正が必要です。

僕の場合は次のようにスクリプトを使いました。

手始めとして pywin32 をインストール

まずは pywin32 をインストールします。

▼ Anaconda・MiniCondaを使っていない場合

▼ Anaconda・Minicondaで環境構築してる場合

これでWindows依存の機能が使えるようになります。

各自環境に portalocker.py を追加する

先ほど紹介した次のページに載ってるコードです

URL : https://code.activestate.com/recipes/65203/

ただPython3では構文の関係からそのままでは動きません。

もしエラーが出るならPython3向けに少し修正してください。

▼ 修正した portalocker.py のコード

恐らく try...except... の箇所さえ直せばOKなはず。
少なくとも僕の環境では少しの手直しで動かせました。

排他的ロックをportalocker.lockで書いたコード例

こういうコードを試しに書いてみました。

▼ 排他的ロックによる多重起動禁止

まずロックファイルをオープン

そのあと portalocker.lock()  に対して fcntl.flock()  と同じような引数で使えます。2番目の引数に portalocker.LOCK_NB  を付与するとロック中にプロセスをブロックしません。

そしてロック中なら IOError が発生するので、発生してたならプロセス起動中。そうでないならプロセス続行のような処理もできます。

以上、fcntl.flockをマルチプラットに使う方法でした。ではまた

Shareこの記事をシェアしよう!

Commentsこの記事についたコメント

2件のコメント
  • といとい

    とても助かりました, ありがとうございます.
    自分の環境では
    45行目: if exc_value[0] == 158:
    を if exc_value.winerror == 158:
    としたら動きました!

    7月 13, 2023 9:38 am
    • ぴー助

      お役に立ったようで良かったです。
      コメントありがとうございました!

      7月 13, 2023 7:56 pm

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください