3

関連性が変動する可能性があるいくつかの背景:

私は現在、いくつかの F2Py ライブラリ (Fortran コードから F2Py によってコンパイルされた Python モジュール) を所有しています。すべての意図と目的において、これらのモジュールを「サードパーティ」と見なすことができます。現在、私は Fortran のソース コードにアクセスできず、コンパイル プロセスも担当していません。

モジュール自体は、私が開発を手伝っている、Python スクリプトをサポートし、複数のプラットフォームで実行されるプログラムにインポートされます。

私は、コンパイル マシン上のライブラリ バージョンとユーザーのマシンが同期しなくなることによって引き起こされる互換性の問題から生じる将来のクラッシュを防止しようとしています。ユーザーのマシンの 1 つが互換性のないバージョンの numpy に変更されたという問題が既に発生しており、これにより、モジュールがインポートされたときに起動時に許容できないセグ フォールトが発生しました。

質問:

F2Py モジュールをインポートする方法を探していますが、モジュールが依存する可能性のある互換性のないライブラリ バージョンが原因で発生する可能性のあるセグ フォールトに対処できるようにする方法です。現在、インポートを呼び出す前にnumpyバージョンをチェックしていますが、最初にインポートしてから、後で問題を「キャッチ」したいと思います。

try:
    import module_name
except SegFault:
    # Deal with it.

特にインポートの結果として、セグメント障害をキャッチすることは可能ですか?

4

3 に答える 3

2

Segfault は例外ではなく、シグナルです。シグナルにハンドラーを割り当てることで、シグナルを「キャッチ」できます。

import signal

def sig_handler(signum, frame):
    #deal with the signal.. 

signal.signal(signal.SIGSEGV, sig_handler)  
于 2012-06-07T09:41:13.570 に答える
1

モジュールをサブプロセス内にインポートしてみてはどうでしょうか?

例 subprocess.call("python -c 'import module_or_modules_in_question'")

または、マルチプロセッシング ジョブを開始し、別のジョブでモジュールを 1 つずつインポートすることもできます。

于 2012-06-07T10:21:45.143 に答える
0

vartecs answerに記載されているように、通常、セグメンテーション違反をキャッチすることはできません。ただし、セグメンテーション違反で失敗するコードをデバッグしようとしていて、それがどこで発生するかわからない場合はfaulthandler、Python 3.3 以降で利用可能なモジュールを使用できます。これでエラーはキャッチされませんが、少なくともトレースバックが表示されるため、発信元を特定するのに役立ちます。ドキュメントから:

$ python3 -c "import ctypes; ctypes.string_at(0)"
Segmentation fault

$ python3 -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault

Current thread 0x00007fb899f39700 (most recent call first):
  File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
  File "<stdin>", line 1 in <module>
Segmentation fault
于 2016-09-29T10:55:34.750 に答える