2009-09-14 17 views
53

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

Windowsで動作させるためにプログラムを少し変更する方法はありますか?

+1

具体的にはfcntlと何をしようとしていますか? fcntl()は多くの異なることを行います。 –

答えて

60

ウィンドウ上のfcntlの代用品は、win32apiコールです。使い方は全く異なります。ちょうど反転できるスイッチではありません。

つまり、fcntl - 重いユーザーモジュールをウィンドウに移植することは簡単なことではありません。 fcntlの呼び出しが何を行うのかを正確に分析し、同等のものがある場合はwin32apiコードを見つけ出す必要があります。

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

fcntlコールの詳細については、同等のものを見つけることができます。

16

これはすぐにあなたを助けていませんが、UNIX(fcntlの)およびWindows(Win32 APIの呼び出し)の両方で動作することができます代替と呼ばれる、そこにある:portalocker

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

http://code.activestate.com/recipes/65203/で元のコードは、現在別のパッケージとしてインストールすることができます - fcntlのモジュールはちょうどので、あなたが複数のアクセスをしようとしていないと仮定すると、ピニングファイルをロックするために使用されhttps://pypi.python.org/pypi/portalocker

28

、これは許容することができ回避策。このモジュールをあなたのPYTHONPATHに置きます。それは公式のfcntlモジュールとして動作するだけです。

this moduleを開発/テスト目的で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 
+0

これはそのようなハックです。しかし、それは私が必要なものです。 :) –

+0

数値定数を追加しました。 –

+1

fcntl.F_GETFDとfcntl.F_SETFDについて教えてください – JimSEOW