web-dev-qa-db-ja.com

Windowsでのfcntlの代替

標準のfcntlモジュールを使用するPythonプロジェクト(たまたまDjangoプロジェクトである場合))を受け取りましたLinuxでのみ利用可能と思われるライブラリ。Windowsマシンで実行しようとすると、このモジュールはここに存在しないため、ImportErrorで停止します。

Windowsで動作するようにプログラムに小さな変更を加える方法はありますか?

62
Ram Rachum

ウィンドウ上のfcntlの代替はwin32api呼び出し。使い方は完全に異なります。ただひっくり返すことができるスイッチではありません。

つまり、fcntl- heavy-userモジュールをWindowsに移植するのは簡単ではありません。各fcntl呼び出しが正確に何をするかを分析してから、同等のwin32apiコード(ある場合)。

fcntlを使用する一部のコードに同等のウィンドウがない可能性もあります。これにより、モジュールapiを変更し、移植するモジュールを使用するプログラムの構造/パラダイムを変更する必要があります。

fcntl呼び出しに関する詳細を提供すると、同等のウィンドウを見つけることができます。

69
nosklo

Fcntlモジュールは固定ファイルをロックするために使用されるだけなので、複数のアクセスを試行しないと仮定すると、これは許容できる回避策になります。このモジュールをsys.path、および公式のfcntlモジュールとして機能するはずです。

このモジュール をWindowsでのみ開発/テスト目的で使用してみてください。

def fcntl(fd, op, arg=0):
    return 0

def ioctl(fd, op, arg=0, mutable_flag=True):
    if mutable_flag:
        return 0
    else:
        return ""

def flock(fd, op):
    return

def lockf(fd, operation, length=0, start=0, whence=0):
    return
31

これはすぐに助けにはなりませんが、Unix(fcntl)とWindows(win32 api呼び出し)の両方で動作する代替手段があります。portalocker

それは、Pythonのflockスタイルのファイルロックのためのクロスプラットフォーム(posix/nt)APIとしてそれ自身を説明します。基本的に、fcntlをwin32 API呼び出しにマップします。

http://code.activestate.com/recipes/65203/ の元のコードは、個別のパッケージとしてインストールできるようになりました- https://pypi.python.org/pypi/ portalocker

16
Joeri