2011-06-24 10 views
2

ポイントマウント上のマウントヒューズにPythonコードを書きました。常に無効な引数エラーを返します。私はCで同じプログラムを試しましたが、うまくいきます。 Python Guruが問題の原因を見つけるのを助けてくれますか?ここにコードを貼り付けました。マウントヒューズはPythonで無効な引数エラーを返します

#!/usr/bin/python 

import stat 
import os 
import ctypes 
from ctypes.util import find_library 

libc = ctypes.CDLL (find_library ("c")) 

def fuse_mount_sys (mountpoint, fsname): 
     fd = file.fileno (file ("/dev/fuse", 'w+')) 
     if fd < 0: 
       raise OSError("Could not open /dev/fuse") 

     mnt_param = "%s,fd=%i,rootmode=%o,user_id=%i,group_id=%i" \ 
         % ("allow_other,default_permissions,max_read=131072", \ 
         fd, stat.S_IFDIR, os.getuid(), os.getgid()) 

     ret = libc.mount ("fuse", "/mount", "fuse", 0, mnt_param) 
     if ret < 0: 
       raise OSError("mount failed with code " + str(ret)) 
     return fd 

fds = fuse_mount_sys ("/mount", "fuse") 

構文をマウントです:

int mount(const char *source, const char *target, 
       const char *filesystemtype, unsigned long mountflags, 
       const void *data); 

私はSWIGを使用してみましたし、またCで使用してプログラムを書き込み、それからの.soを作成し、それが働きました。しかし私は純粋なpythonで書くことに興味があります。前もって感謝します。 straceのの

出力:

$ strace -s 100 -v -e mount python fuse-mount.py 
mount("fuse", "/mount", "fuse", 0, "allow_other,default_permissions,max_read=131072,fd=3,rootmode=40000,user_id=0,group_id=0") = -1 EINVAL (Invalid argument) 


$ strace -s 100 -v -e mount ./a.out 
mount("fuse", "/mount", "fuse", 0, "allow_other,default_permissions,max_read=131072,fd=3,rootmode=40000,user_id=0,group_id=0") = 0 
+0

stackoverflowの質問で提示されたプログラムを簡略化することができれば、例えば15行未満であれば大きな助けになるでしょう。複雑なエラー処理は必要ありません。 'fd <0:raise ValueError( 'fileno failed')'で十分です。また、 'print''呼び出しは、実際の問題をあまり助けず、難読化しません。 – phihag

+0

そのことに言及してくれてありがとう、次回は気をつけます。 – hue

答えて

2

ctypes.c_void_pは、文字列で初期化することはできません。代わりに、c_void_pのない文字列を使用してください。

それらが一致するまで、あなたはその後、

strace -v -e mount python mymount.py 

strace -v -e mount ./mymount-c 

の出力を比較することができます。

また、マウントするときにファイルハンドルfdが開いていることを確認してください。 file("/dev/fuse", 'w+')は自動的にガベージコレクトされ、cpythonを含むいくつかのPython実装によって閉じられます。これを防ぐには、file("/dev/fuse")の結果を変数に代入します。

+0

out c_void_pを指定しても、同じエラーが発生します。パラメータを渡す方法が間違っていますか? – hue

+0

@hueおそらく、少し異なるフォーマットを渡して融合する必要があります。あなたはあなたの質問にstraceの出力を含めることができますか? – phihag

+0

@phihag straceの出力を更新しました。ほかに何か要りますか? – hue

関連する問題