
Pythonのctypesを使っていてふと気になったので質問させていただきます。
Cと少々Java、程度の経験しかなかった私にとって、ctypesによって「Cのデータ型を利用できる」「dllをロードして、エクスポートされている関数を使用できる」というのは衝撃でした。
しかし、考えてみれば、仕組みとして理解できなくもない・・・かな?と現在は思っています。
ただ気になったのは、
・どうして静的リンクライブラリ(.lib)の方は対応してないの?
ということです。
[質問1]これは原理的に不可能なのでしょうか、それともctypesやPythonの仕様としてできないだけなのでしょうか。
(おそらくは「原理的に不可能」なのだろう、と個人的には思っておりますが・・・。)
以下は私の中の解釈ですが、
・マシン語として実行可能な形式になっているdllは、実行時のリンクの機構さえ整っていれば別にC言語でなくともロードや中身のコードを利用することはできる。
・また、Cのデータ型についても、要は型のバイト数やフォーマット(つまり内部的な扱われ方)をPythonインタプリタが押さえていれば良い話であるから、PythonでCの型を使用することは原理的に可能。
さて、
[質問2]それではlibはどうか。
libもコンパイル済みのものであるなら、Python(またはC以外の言語)からlib内のコードを利用することはできるのではないか?
どちらかのみの回答でも結構です。
また、解釈の誤りについてのご指摘や、リンクライブラリの仕組みを解説したページを教えてくださると助かります。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
動的ライブラリは本質的に実行可能プログラムです。
一部参照が未解決の場合がありますが、それらはローダで解決できるようになっています。Windows DLLの場合、C形式(cdecl)やC++形式(stdcall)といったエントリポイント形式が決まっているので、メモリにロードしてエントリポイントを適切に呼び出せば使えます。静的ライブラリは機械語プログラムの断片に過ぎません。変数や関数の参照解決ができていませんので、そのままでは実行できず、リンカと呼ばれる開発ツールによって実行可能プログラムに変換しないと使えません。Python実行環境はリンカを内蔵していないので静的ライブラリを使うことはできません。なお、一般的に静的ライブラリの構造は開発ツールにより異なるので、開発ツールごとに個別のリンカが必要です。
# 例えばVisual C++(.lib)とCygwin gcc(.a)では違う
リンクを行う機構が備わっていればPythonでも.libのコードを組み込むことは可能・・・。
ただPythonにはそういうものはないので、やりたければ自分で実装・拡張してくださいよ、と。そして静的ライブラリは形式によって内部の構造も異なるし、動的ライブラリの方が主流(これはどこかのページで見ただけですが)であることからコスト的にもあんまり見合わない。・・・と、私なりに解釈しました。
私が何に疑問を感じていたのか。というのが、寄せられた回答を咀嚼するうちにはっきりしてきた気がします。
が、それはまた別の質問として立てさせていただくことにします。
回答ありがとうございました。
No.1
- 回答日時:
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をお使いと判断しました。
回答ありがとうございます。
Python-C APIのページは読んだことがなかったです。
Pythonの正体(?)を知らないままなんとなく触っていたもので・・・Python <--> C の間でいろいろできるのも(理屈はさておき)得心できました。
(少なくとも、Windowsの).libの場合は(Cでもやるように)通常通り実行ファイルのビルド時に組み込むしかない、ということですね。
※そうですね、Windowsです。その辺はLinuxでも良かったのですけど、プラットフォームによる違いは今回そこまで重要でなかったので。
Windows前提で書いたものでしたが、少々言葉足らずでしたね;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- 宇宙科学・天文学・天気 AIが答えた方程式 1 2023/02/20 00:12
- UNIX・Linux ChromebookでPythonを使いたい! けれどLinuxが入らない… 4 2022/05/05 08:49
- 数学 最大エントロピー原理をpythonで実装したい 2 2022/06/21 13:10
- 教えて!goo 「質問する」って何ですか? 分からない事や知りたい事ですよね? 質問の「質」って誰が決めるの? 2 2022/06/04 20:41
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- 大学受験 現代文について教えください。 問題 傍線部1「科学的方法」とあるが、それは具体的にいうとどのような方 3 2022/10/16 20:31
- 英語 ソシュール言語観による品詞、単語、辞書理解の誤り 4 2022/11/24 12:27
- 日本語 「~人」と「~名」の使い分け 2 2022/06/02 11:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スタティックリンクライブラリ...
-
C++によるPostgreSQLの接続
-
BorlandC++Builder5.0でリンカ...
-
WindowsにおけるPostgreSQL+C言...
-
error LNK2001: 外部シンボル "...
-
'stdafx.h'のエラーに関して
-
富士通のSoftune
-
DirectXのdmusici.libについて
-
dllかlibか
-
exeファイルはどのdllを参照す...
-
opencvで画像上に丸を描画の方法
-
GDLの設定
-
C++Builder リンカエラーとは?
-
eclipseでのcsvファイル読み込み
-
VC++でビルド時の、リンク警告 ...
-
'd3dx9.lib' が開けません。
-
【VS2008 C++】2つのプロジェ...
-
スタティックライブラリ関係の...
-
インポートライブラリ(.lib)フ...
-
operator new が再定義されてい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
visual studio community2017 O...
-
C++Builder リンカエラーとは?
-
fatal error LNK1104: ファイル...
-
スタティックライブラリ関係の...
-
静的/動的リンクライブラリにつ...
-
【VS2008 C++】2つのプロジェ...
-
error LNK2019: 未解決の外部シ...
-
C言語のPathFileExistsについて
-
「MFCを使用しない」から「MFC...
-
'stdafx.h'のエラーに関して
-
dllかlibか
-
VS2010にて、依存関係とビルド順
-
'd3dx9.lib' が開けません。
-
VC++でビルド時の、リンク警告 ...
-
eclipse+MinGWの環境で外部ライ...
-
インポートライブラリ(.lib)フ...
-
C/C++の.libについて教えてくだ...
-
#pragma commentの相対パス指定
-
OpenSSLの共有ライブラリ(libcr...
-
MP3の再生
おすすめ情報