10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport os 20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport sys 30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport unittest 40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Bob Ippolito: 60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi""" 70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiOk.. the code to find the filename for __getattr__ should look 80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yisomething like: 90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport os 110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom macholib.dyld import dyld_find 120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef find_lib(name): 140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi possible = ['lib'+name+'.dylib', name+'.dylib', 150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi name+'.framework/'+name] 160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for dylib in possible: 170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return os.path.realpath(dyld_find(dylib)) 190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError: 200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise ValueError, "%s not found" % (name,) 220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiIt'll have output like this: 240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi >>> find_lib('pthread') 260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi'/usr/lib/libSystem.B.dylib' 270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi >>> find_lib('z') 280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi'/usr/lib/libz.1.dylib' 290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi >>> find_lib('IOKit') 300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi'/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit' 310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi-bob 330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi""" 350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom ctypes.macholib.dyld import dyld_find 370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef find_lib(name): 390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi possible = ['lib'+name+'.dylib', name+'.dylib', name+'.framework/'+name] 400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi for dylib in possible: 410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi try: 420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi return os.path.realpath(dyld_find(dylib)) 430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi except ValueError: 440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi pass 450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi raise ValueError("%s not found" % (name,)) 460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass MachOTest(unittest.TestCase): 480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi if sys.platform == "darwin": 490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi def test_find(self): 500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(find_lib('pthread'), 520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi '/usr/lib/libSystem.B.dylib') 530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi result = find_lib('z') 550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(result.startswith('/usr/lib/libz.1')) 560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertTrue(result.endswith('.dylib')) 570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi self.assertEqual(find_lib('IOKit'), 590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi '/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit') 600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi 610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif __name__ == "__main__": 620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi unittest.main() 63