我正在尝试将我的应用程序移植到Mac,但我不明白是什么导致了这个问题。
在某些时候,我尝试使用ctypes'LoadLibrary
加载第三方提供的几个C ++库。对于Windows,我有dll,而对于Mac,dylibs。加载dylib也会出错,我也试图解决,但这不应该是一个问题,因为我确实有一个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)
。
日志方法非常明显:
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
时有权附加到文件。我有什么想法可以解决这个问题吗?
答案 0 :(得分:3)
您正在使用相对路径打开日志文件,但是在失败之前更改了目录:
os.chdir(os.path.dirname(libpath))
使用绝对路径打开日志文件,因为您显然无法在os.path.dirname(libpath)
中写入。