9

私はPythonの初心者です。Mac OS X Lion でタイプ ライブラリを使用して次の Python サンプル コードを試したとき:

#hello.py
from ctypes import *
cdll.LoadLibrary("libc.so.6")
libc = CDLL("libc.so.6")
message_string = "Hello World! Hello Python!\n"
libc.printf("Testing :%s",message_string)
//

以下のようにエラーが発生しました。

Traceback (most recent call last):
File "cprintf.py", line 2, in <module>
cdll.LoadLibrary("libc.so.6")
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 431, in LoadLibrary
return self._dlltype(name)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 353, in __init__
self._handle = _dlopen(self._name, mode)
OSError: dlopen(libc.so.6, 6): image not found

誰が私に何が問題なのか教えてもらえますか? ところで、私はこれを Windows と Linux で試しました。それはうまくいきました。ctype の設定を行う必要があります。

どうもありがとう、

リッキー

4

3 に答える 3

18

.dylibMac OS Xの共有ライブラリには、の代わりに拡張子が付いている傾向があり.soます。この場合、/usr/lib/libc.dylibあなたが望むものなので、ロードしますlibc.dylib

于 2012-07-19T05:22:37.373 に答える
4

OS X は共有オブジェクトの拡張子に「.dylib」を使用するため、代わりに「libc.dylib」を使用する必要があります。

于 2012-07-19T05:20:43.453 に答える
2

クロスプラットフォームのソリューションは、次のようなものを使用することです。

import platform
import ctypes

libc = ctypes.cdll.LoadLibrary("libc.{}".format("so.6" if platform.uname()[0] != "Darwin" else "dylib"))
# or ctypes.CDLL("libc.{}".format("so.6" if platform.uname()[0] != "Darwin" else "dylib"))

どちらもうまく機能しているように見えるため、これらの代替案の違いはよくわかりません!

于 2016-02-27T21:41:26.713 に答える