0

アプリケーションを Mac に移植しようとしていますが、この問題の原因がわかりません。

ある時点で、ctypes を使用して、サードパーティが提供するいくつかの C++ ライブラリを読み込もうとしましたLoadLibrary。Windows には dll があり、Mac には dylib があります。dylibs をロードするとエラーも発生しますが、これも解決しようとしていますが、ここでは問題にならないはずです。まさにそのための try/except ブロックがあるからです。

try:
    self.log('Lib exists? %s: %s' % (libpath, os.path.exists(libpath)))       
    origdir = os.getcwd()
    os.chdir(os.path.dirname(libpath))
    self.lib = cdll.LoadLibrary(os.path.basename(libpath))
    os.chdir(origdir)
    self.log("Loaded Library!")
except Exception as e:
    self.log('Error importing Library! %s' % e)
    self.lib_loaded = False

問題はすべてログ ファイルに書き込まれます。問題は、最初の呼び出しでは何らかの形で機能するログ ファイルに追加されますが、上記のフラグメントで
self.log('Error importing Library! %s' % e).

log メソッドは非常に明白です。

def log(self, text):
    if self.debug:
        print text
        with open('logfile.log', 'a') as w:
            w.write('%s\n' % text)   

Windows では、これは問題なく動作します。ライブラリが見つかると読み込まれ、見つからない場合は適切なメッセージが出力され、ログに書き込まれます。しかし、Macではエラーが発生します

Lib exists? /usr/local/lib/path/to/Mylib: True
Error importing Library! dlopen(lib.dylib, 6): no suitable image found.  Did find:
    lib.dylib: mach-o, but wrong architecture
    /usr/local/lib/lib.dylib: mach-o, but wrong architecture
Traceback (most recent call last):
  File "myapp.py", line 987, in <module>
    foo = Foo(pyqtapp, splash)
  File "myapp.py", line 83, in __init__
    self.thelibLink = libLink.libLink(0.05, a, b)
  File "libLink.py", line 100, in __init__
    self.log('Error importing Library! %s' % e)
  File "libLink.py", line 326, in log
    with open(self.logfile, 'a') as w:
IOError: [Errno 13] Permission denied: 'logfile.log'

logfile.log権限が-rw-r--r--あり、私が所有しているため、これは私には意味がありません。さらに、プログラムを実行した後、ログファイルには次の内容が含まれます。

==Log of date/time==
Lib exists? /usr/local/lib/path/to/Mylib: True

だからどういうわけかself.log、初めて呼び出されたときにファイルに追加する権限があります。これを解決する方法はありますか?

4

1 に答える 1

3

相対パスでログ ファイルを開いていますが、失敗する直前にディレクトリを変更します。

os.chdir(os.path.dirname(libpath))

明らかに書き込めないため、代わりに絶対パスでログファイルを開きますos.path.dirname(libpath)

于 2012-10-27T14:29:05.437 に答える