Python
 Computer >> コンピューター >  >> プログラミング >> Python

C拡張モジュールからPython例外を発生させて捕捉する方法

C言語で記述した拡張モジュール内でPyErr_SetStringなどのAPIを使って例外を発生させた場合、その例外は通常のPythonコードと同じようにtry-except文で捕捉できます。ここでは、拡張モジュールのビルドから例外の捕捉までの一連の手順を解説します。

1. セットアップスクリプト(setup.py)の作成

まず、C拡張モジュールをビルドするためのsetup.pyスクリプトを用意します。以下のように記述します。

from distutils.core import setup, Extension

setup(name='helloworld', version='1.0', \
      ext_modules=[Extension('helloworld', ['hello.c'])])

このスクリプトでは、hello.cというソースファイルからhelloworldという名前の拡張モジュールをビルドするよう定義しています。

2. 拡張モジュールのインストール

次に、以下のコマンドを実行して拡張モジュールをビルドし、インストールします。

$ python setup.py install

インストールが完了すると、通常のPythonモジュールと同じようにimportできるようになります。

3. Pythonスクリプトから例外を捕捉する

インストール済みの拡張モジュールをPythonスクリプト(test.py)から呼び出し、C言語側で発生させた例外をtry-except文で捕捉してみましょう。

# test.py
import helloworld

try:
    print(helloworld.helloworld())
except Exception as e:
    print(str(e))

C言語側でPyErr_SetStringによって設定されたエラーメッセージが、そのままPythonの例外として伝わります。

4. 実行結果

このスクリプトを実行すると、次のような出力が得られます。

bad format char passed to Py_BuildValue

このように、C拡張モジュール内で発生させた例外も、標準的なPythonの例外処理の仕組みを使って自然に扱うことができます。エラーチェックをCコード側に組み込んでおくことで、Pythonから安全かつ柔軟に拡張モジュールを利用できるようになります。

  1. 【初心者向け】Pythonでリストから要素を削除する4つの方法|pop()・remove()・del・clear()の使い方

    Pythonのリスト(list)は線形データ構造の一つで、要素が連続したメモリ領域に格納され、各要素にはインデックスを使ってアクセスできます。 プログラミングをしていると、リストから特定の要素を削除したい場面によく出会います。Pythonにはそのための組み込み機能がいくつか用意されており、目的に応じて使い分けることが大切です。この記事では、代表的な4つの方法「pop()」「remove()」「del」「clear()」をコード例とともに解説します。 1. pop():インデックスを指定して削除する pop() は、引数として渡したインデックス位置にある要素を削除します。さらに、削除された要素を

  2. 【Python】Tkinterでラベルのテキストを削除する方法をわかりやすく解説

    Tkinterは、PythonでGUIベースのアプリケーションを作成・開発するための標準ライブラリです。この記事では、何らかのテキストが表示されているラベルから、そのテキストを削除する方法を解説します。 ラベルからテキストを削除するには、ラベルの表示を切り替えるトリガーとして機能するボタンを作成します。具体的には、config()メソッドを使ってラベルのtext属性を空の文字列に書き換えます。 サンプルコード # Tkinterライブラリをインポート from tkinter import * # tkinterフレームのインスタンスを作成 win = Tk() # ウィンドウのサイズを