プロが教えるわが家の防犯対策術!

Pythonのctypesを使っていてふと気になったので質問させていただきます。

Cと少々Java、程度の経験しかなかった私にとって、ctypesによって「Cのデータ型を利用できる」「dllをロードして、エクスポートされている関数を使用できる」というのは衝撃でした。
しかし、考えてみれば、仕組みとして理解できなくもない・・・かな?と現在は思っています。

ただ気になったのは、
 ・どうして静的リンクライブラリ(.lib)の方は対応してないの?
ということです。

[質問1]これは原理的に不可能なのでしょうか、それともctypesやPythonの仕様としてできないだけなのでしょうか。
(おそらくは「原理的に不可能」なのだろう、と個人的には思っておりますが・・・。)

以下は私の中の解釈ですが、
・マシン語として実行可能な形式になっているdllは、実行時のリンクの機構さえ整っていれば別にC言語でなくともロードや中身のコードを利用することはできる。
・また、Cのデータ型についても、要は型のバイト数やフォーマット(つまり内部的な扱われ方)をPythonインタプリタが押さえていれば良い話であるから、PythonでCの型を使用することは原理的に可能。

さて、
[質問2]それではlibはどうか。
libもコンパイル済みのものであるなら、Python(またはC以外の言語)からlib内のコードを利用することはできるのではないか?

どちらかのみの回答でも結構です。
また、解釈の誤りについてのご指摘や、リンクライブラリの仕組みを解説したページを教えてくださると助かります。
よろしくお願いします。

A 回答 (2件)

動的ライブラリは本質的に実行可能プログラムです。

一部参照が未解決の場合がありますが、それらはローダで解決できるようになっています。Windows DLLの場合、C形式(cdecl)やC++形式(stdcall)といったエントリポイント形式が決まっているので、メモリにロードしてエントリポイントを適切に呼び出せば使えます。
静的ライブラリは機械語プログラムの断片に過ぎません。変数や関数の参照解決ができていませんので、そのままでは実行できず、リンカと呼ばれる開発ツールによって実行可能プログラムに変換しないと使えません。Python実行環境はリンカを内蔵していないので静的ライブラリを使うことはできません。なお、一般的に静的ライブラリの構造は開発ツールにより異なるので、開発ツールごとに個別のリンカが必要です。
# 例えばVisual C++(.lib)とCygwin gcc(.a)では違う
    • good
    • 0
この回答へのお礼

リンクを行う機構が備わっていればPythonでも.libのコードを組み込むことは可能・・・。
ただPythonにはそういうものはないので、やりたければ自分で実装・拡張してくださいよ、と。そして静的ライブラリは形式によって内部の構造も異なるし、動的ライブラリの方が主流(これはどこかのページで見ただけですが)であることからコスト的にもあんまり見合わない。・・・と、私なりに解釈しました。

私が何に疑問を感じていたのか。というのが、寄せられた回答を咀嚼するうちにはっきりしてきた気がします。
が、それはまた別の質問として立てさせていただくことにします。

回答ありがとうございました。

お礼日時:2011/06/18 09:38

Python-C APIの資料は読んだことありますか?


例えば
http://www.python.jp/doc/release/extending/index …
http://www.python.jp/doc/release/c-api/index.html

PythonからCの関数が呼び出せる、といっても、なんでもかんでも使えるわけではありません。
直接呼び出すためには、Pythonの規則にしたがう必要があります。
正に「Cで書いてあるけど、Pythonのモジュール」です。


静的ライブラリというのは、それ単独で利用できるものではありません。リンクして初めて利用できるものです。これは、Pythonだから、というわけではなく、Cでも使う場合でもそうです。
Cで分割コンパイルはやったことありますか?あのときできる .objファイルを一つにまとめただけのものだと考えていればよいです。

Pythonから使おうとするなら、Pythonの実行ファイルをビルドする際に一緒にリンクする、と言った方法でなければ、利用できません。
あるいは、Pythonから呼び出せるDLLをビルドする時に一緒にリンクするか、ですが、これはDLLを作るときに極普通に使われている方法です。
どちらにしても、Pythonから呼び出すための専用の関数の用意も必要です。

# .lib,DLLとあることから、Windowsをお使いと判断しました。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
Python-C APIのページは読んだことがなかったです。
Pythonの正体(?)を知らないままなんとなく触っていたもので・・・Python <--> C の間でいろいろできるのも(理屈はさておき)得心できました。

(少なくとも、Windowsの).libの場合は(Cでもやるように)通常通り実行ファイルのビルド時に組み込むしかない、ということですね。

※そうですね、Windowsです。その辺はLinuxでも良かったのですけど、プラットフォームによる違いは今回そこまで重要でなかったので。
Windows前提で書いたものでしたが、少々言葉足らずでしたね;

お礼日時:2011/06/18 09:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!