PythonでC言語のモジュールを利用する方法

このQ&Aのポイント
  • Pythonで利用できるモジュールを、C言語で作成したいと思っているのですが、方法が良くわかりません。
  • 現在、Windowsで、CygwinのGCCを用いて、C言語をコンパイルしています。GCCでコンパイル→DLLファイル作成→Pythonで利用?という大まかな流れかな~と思いまして、
  • import testmodule(あるいは、import testmodule.dll)とかやったのですが、ImportError: DLL load failed: 指定されたモジュールが見つかりません。と言われてしまいました。
回答を見る
  • ベストアンサー

Pythonで、C言語のモジュールを利用したい!

初めまして。 どなたか回答いただければ幸いです。 Pythonで利用できるモジュールを、C言語で作成したいと思っているのですが、方法が良くわかりません。 現在、Windowsで、CygwinのGCCを用いて、C言語をコンパイルしています。 GCCでコンパイル→DLLファイル作成→Pythonで利用? という大まかな流れかな~と思いまして、 見よう見まねで、 $gcc -shared test.o -o testmodule.dll というコマンドでDLLファイルを作成して、それをPythonで認識できるフォルダに格納して、Pythonのプロンプトで、 >>>import testmodule(あるいは、import testmodule.dll) とかやったのですが、 ImportError: DLL load failed: 指定されたモジュールが見つかりません。 と言われてしまいました。 鋭意調査中ですが、ご存知の方がおられましたら、 ご教授お願いいたします。

  • Python
  • 回答数4
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

みようみまねってのが非常に気になるのですが、 #1の方が提示されたのでも良いですし Python インタプリタの拡張と埋め込み http://www.python.jp/doc/release/ext/ とかには目を通した上で作業されているのでしょうか? もっとも以下のページが簡潔にして必要最低限のことを まとめているようです 西尾泰和のブログ @ Cybozu Labs: Python拡張の作り方 http://labs.cybozu.co.jp/blog/nishio/2007/06/python.html あ、注意しておきますが、Python本体のコンパイルに使われた コンパイラと同じ物を使わないとだめですよ。 (cygwinの)gccを使いたいのなら、cygwinのパッケージにある Pythonが対象になります。 PythonのメインのページにあるWindows用の バイナリはVC++(7.1?)でないとダメです。 >ご教授お願いいたします。 こういう場合は教示を使います。

yamadeen
質問者

お礼

今更ですがありがとうございました。

yamadeen
質問者

補足

早速の回答ありがとうございます。 Python インタプリタの拡張と埋め込みは、ざっと読んでたのですが、DLLファイルの作り方とかで悩んでいたので、詳細はまだ読んでいませんでした。 お教えいただいた、西尾泰和のブログ @ Cybozu Labs: Python拡張の作り方を、よく読んでみようと思います。 >あ、注意しておきますが、Python本体のコンパイルに使われた >コンパイラと同じ物を使わないとだめですよ。 違うのを使ってました・・・ cygwinのPythonを使ってみます。 色々とありがとうございました。

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

> コンパイラは、別に本体と同じものの必要はないです。 んなことはありません。 問題が出ない場合もありますが、一見わけのわからない誤動作が起きる可能性があるので、 コンパイラ(VC++の場合はバージョン)を同じものにしなければなりません。 python.orgで配布されている 2.5.4 の python25.dllのインポート先を見ると MSVCR71.dll 1E0ED1AC Import Address Table 1E1AB988 Import Name Table 0 time date stamp 0 Index of first forwarder reference と、VC7.1 のCライブラリランタイムを参照していますので、 別のランタイムの同名の関数を使ったりするとはまります。

yamadeen
質問者

お礼

今更ですがありがとうございました。

yamadeen
質問者

補足

回答ありがとうございます。 むぅ。私にはちょっと難しいですが、 西尾泰和のブログ @ Cybozu Labs: Python拡張の作り方 を参考にさせていただいて、すべてCygwin環境にて出来ました。 ありがとうございました。 因みにCygwin環境で作ったdllを、 CygwinではないPython標準リリースのプロンプトにてimportした際には、 固まってしまいました。 そういうところにも注意したいと思います。

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.3

拡張子は、.dll じゃなくて .pyd にしないと駄目ですよ。 コンパイラは、別に本体と同じものの必要はないです。 ただし、呼び出し規約(cdll or Stdcall)を本体と合わせる必要があります。

yamadeen
質問者

お礼

今更ですがありがとうございました。

yamadeen
質問者

補足

回答ありがとうございます。 A No.2にある、 西尾泰和のブログ @ Cybozu Labs: Python拡張の作り方 のとおりにやったところ、出来たファイルは、dllファイルでした。 pydについても調べてみたいと思います。

noname#39970
noname#39970
回答No.1

良く読んでないけどこのあたりかなぁ? http://docs.python.org/ext/using-cobjects.html

yamadeen
質問者

お礼

今更ですがありがとうございました。

yamadeen
質問者

補足

早速の回答ありがとうございます。 C言語でPython.hをつけたり、ラッピングしてからでないと使用できないというのは分かったのですが、具体的なモジュールの生成方法とかがよく分かっておりません。(そもそもDLLファイルでよいのか?import "ファイル名"でよいのか?) そこらへんを経験のある方がおられましたら、よろしくお願いいたします。

関連するQ&A

  • gccとPython.hのパス

    cygwinでPythonの拡張モジュールを作成しようとgcc test.c とすると、Python.hがありませんと表示されます。 インクルードパスを通すにはどのようにしたら良いのでしょうか? //test.c #include <Python.h> ..

  • C言語とpython言語について。

    Visual Studio Codeで、C言語(これは必要なものを全てインストール済み)で、その上で、python言語のインスール(必要なもの全て)しても、C言語が、実行&コンパイル出来なくなる事はないですよね?教えて頂けると幸いです。

  • Python クラスとモジュールの違いについ

    プログラミング初心者です。※初めてのプログラミングでPythonの勉強中です。開始2週間程度です!! Pythonにおける(プログラム一般における?)クラスとモジュールの違いが分かりません。 ■現状の認識 ・モジュール 「***.py」といったような一つのファイル 他のモジュールからimportすることによって使用できる ・クラス 「***.py」といった一つのファイルの中に「class」として宣言できる 他のモジュールからインスタンスを生成して使用できる ■疑問点 上記を使い分ける意味 上記を使い分けた時のメリット、デメリット ※すべてモジュールとして作成して、使用したいときにimportすればいいのでは?と考えています。 現状Pythonの知識しかありませんが、プログラミング一般の知識のような気がしています。 プログラムに詳しい方よろしくお願い致します。

  • c言語について、質問します。

    c言語について、質問します。 環境設定を行いましたが、 コンパイルが何度、やってもできません。 c:?source>gcc -o sample sample.c と入力すると、 gcc:installation problem, cannot exec cc1':No such file or directory とでます。 成功したら、このような文字はでないとかいてあるのですが、どうすればよろしいですか?

  • C言語の実行モジュール、コンパイル

    2点程、教えて頂きたい事があります。 よろしくお願いします。 (1)Solaris9でC言語でコンパイルされた実行モジュールを、そのままSolaris10にコピーし実行した場合、実行できるのでしょうか? (2)Solaris10で、makefile等を利用しC言語のコンパイルをしようと思うのですが、Solaris10がインストールされた段階で既にコンパイルする環境は整っているのでしょうか?。それともCD等からコンパイル環境をインストールしないといけないのでしょうか?(Solarisメディアが無い場合にコンパイル可能でしょうか?)

  • 独習C言語のコンパイル

    C言語初心者です。 他の方が質問されてて、 その回答通りにコンパイルを実施したのですが、 何度やっても同様の現象となり、そこからなかなか進めません。 C:\TYC4TH>gcc C:\TYC4TH\test.c -c test.exe gcc: test.exe: No such file or directory C:\TYC4TH>dir 2008/05/10 16:29 120 test.c 2008/05/10 16:32 590 test.o となり、なぜかtest.oが作成されます。 申し訳ないですが、ご教授願います。

  • Pythonのバージョンアップについて

    CentOS5.5にはPython2.4がデフォルトで入っているのですが、Python2.6でスクリプトを作成する必要がありバージョンアップをしているのですが、dbusモジュールのインポートができず行き詰っております。 具体的には、Python2.4とdbus-pythonがインストールされている状態で、下記のURLを参考にyumでPython2.6をインストールしました。 環境としては「/usr/bin/phthon2.4」と「/usr/bin/phthon2.6」が出来た状態です。 libは「「/usr/lib/phthon2.4」と「/usr/lib/phthon2.6」です。 dbus-pythonのインストール先は「/usr/lib64/python2.4/site-packages/dbus」になります。 Python2.4を環境で下記のインポートは問題ありません。 >>>import dbus しかし、Python2.6環境で同じコマンドを実行すると下記のようなエラーになります。 >>> import dbus Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named dbus dbusの再インストールはリスクが高いと思い、モジュールのパスを通してみたところ下記のようなエラーになりました。 >>> import sys >>> sys.path.append('/usr/lib64/python2.4/site-packages') >>> import dbus Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python2.4/site-packages/dbus/__init__.py", line 1, in <module> from _dbus import * File "/usr/lib64/python2.4/site-packages/dbus/_dbus.py", line 45, in <module> import dbus_bindings ImportError: /usr/lib64/python2.4/site-packages/dbus/dbus_bindings.so: undefined symbol: Py_InitModule4 rpmでモジュールインストール先の変更や、Python自体をソースからインストールなどしてみたのですが、全てうまく行かない状態です。 Pythonバージョンアップ前にインストールされているモジュールの使い方をご存知の方がおられましたら、宜しくお願いします。

  • C言語について教えていただきたいです

    以下3種類のファイルがあり(リンクをご参照いただきたいです)、 A.c ( http://denny-hrj.com/a.c ) B.c( http://denny-hrj.com/b.c ) X.h ( http://denny-hrj.com/x.h ) A.cを書き換えて、追加を可能にし gcc -o D.out B.c D.c でコンパイル可能に、 さらに、D.cを書き換え、追加と削除を可能にし、 gcc -o E.out B.c E.c でコンパイル可能にする。 これらはどのように書き換えればいいでしょうか? 必要に応じてB.cを書き換える場合、どのように書き換えるべきかもご教授いただきたく存じます。 まだC言語の初心者で理解が浅く、私自身のレベルはそこまで達していないのですが、 期限が近づいてきてしまいました。 どうか、お願いいたします。

  • Cygwinでコンパイルできません。

    CygwinをすべてDefaultでインストールしました。 テキストエディタとしてTeraPadを利用しています。 テラパッドでtest.cというファイルをつくり、 gcc -o test test.c でコンパイルしたのですが gcc:test.c:No such file or directory gcc:no input files と表示されます。 正常にコンパイルするにはどうしたらいいのでしょうか? 自分はC言語について勉強したばかりでくわしくないので、この質問を書いていて言葉足らずなところがあり説明不十分かもしれませんが、よろしくお願いします。

  • C言語からjavaを呼び出したい

    C言語からjavaを呼び出したいのでjniを使うことにしました。 各言語のソースはWebで見つけたサンプルを見ながら何とか作成し、各々コンパイルまで終わったのですが、javaのオブジェクト(?)をどこに置いたら良いのかさっぱりわかりません。 java使いの人達には常識の話だと思いますがjavaはサーブレットしか作ったことが無くどうしたものかと困っています。 分からないのは次の2点です。 1.classファイルのままでも良いのかjarにしないといけないのか? 2.どこに設置したら良いのか? これまでやったこと 1.javaのソースを作成しコンパイルしました(classファイルのままです) 2./etc/profileに次のコマンドを追加しました。 LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/java/jdk1.7.0_03/jre/lib/amd64/server export LD_LIBRARY_PATH 3.C言語のソースを次のコマンドでコンパイルしました。 % gcc -I/usr/java/jdk1.7.0_03/include/ -I/usr/java/jdk1.7.0_03/include/linux -L/usr/java/jdk1.7.0_03/jre/lib/amd64/server -ljvm -lpthread jnitest.c -o jnitest 4.javaモジュールの設置←これがわかりません 初歩的な質問で申し訳ありませんがご教示下さい。

    • ベストアンサー
    • Java

専門家に質問してみよう