2017-08-19 10 views
0

私はimportlib.import_module("somemodulename")を呼び出して、カスタマイズされたユーザー定義のカスタムモジュールをインポートしています。このインポートは失敗する可能性があります。なぜ私はトレースバックを印刷する必要があるので、それが失敗した理由についての情報をユーザに与えたいが、それはimportlibモジュールからの非常に長い行に満ちている傾向がある。例えば、それは:トレースバックの先頭から複数の行を削除します

Traceback (most recent call last): 
    File "C:\abc\cde\efg\importer.py", line 101, in load 
    self.__module = importlib.import_module(self.__name) 
    File "C:\Programming\Python36-32\lib\importlib\__init__.py", line 126, in import_module 
    return _bootstrap._gcd_import(name[level:], package, level) 
    File "<frozen importlib._bootstrap>", line 978, in _gcd_import 
    File "<frozen importlib._bootstrap>", line 961, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 950, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 655, in _load_unlocked 
    File "<frozen importlib._bootstrap_external>", line 678, in exec_module 
    File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed 
    File "C:\abc\cde\efg\modules\testerror.py", line 3, in <module> 
    x = 1/0 # intentional error for module testing purposes 
ZeroDivisionError: division by zero 

です。明らかに、ほとんどの行はユーザーにとって関心がありません。 (これは将来のバージョンで変更することがあり、実装の詳細である、かもしれ

Traceback (most recent call last): 
    File "C:\abc\cde\efg\modules\testerror.py", line 3, in <module> 
    x = 1/0 # intentional error for module testing purposes 
ZeroDivisionError: division by zero 

をしかし、問題は、私はimportlibパッケージから生成された行の数に頼ることができないということです。私は、トレースバックは次のようになりたいですプラットフォームやPythonのインストールに固有のものです)、私はスキップしたいカスタムモジュールのエラー(彼は自分自身でいくつかの他のモジュールをインポートすることができますエラーの原因となる可能性があります)によって生成された行の数も、それをさらに複雑にするために、ユーザーはimportlibモジュール機能を呼び出すこともできます。この場合、トレースバックに含める必要があります。

つまり、トレースバックからのエラー行importlibのすべての最初のブロックを取り除く必要があります。トレースバックラインの構文解析以外のアイデアは、importlibパッケージの実装の詳細が多すぎるため、巧妙で壊れやすいソリューションになると思いますか?

注:私は、Python 3.5+を使用しています、ソリューションはプラットフォームに依存しない

+0

[traceback](https://docs.python.org/3/library/traceback.html)モジュールをご覧ください。 – direprobs

答えて

0

OKである必要があり、私はtracebackimportlibモジュールに深く掘って、私は私が解決策を見つけたと思います。これは通常のPythonファイルのモジュールでうまくいくようです。ただし、フリーズされたパッケージ、パッケージ化されたパッケージなどについてはわかりません。これらのシナリオのテストがさらに必要です。

import importlib 
import sys 
import traceback 

moduleName = "somepackage.somemodule" 
try: 
    importlib.import_module(moduleName) 
except Exception: 
    spec = importlib.util.find_spec(moduleToImport) 
    if spec is None: 
     # if the module is not found, then do not print traceback at all 
     count = 0 
    else: 
     fileName = spec.loader.get_filename() 
     extracts = traceback.extract_tb(sys.exc_info()[2]) 
     count = len(extracts) 
     # find the first occurrence of the module file name 
     for i, extract in enumerate(extracts): 
      if extract[0] == fileName: 
       break 
      count -= 1 
    # keep only the count of last lines 
    print(traceback.format_exc(limit=-count)) 
関連する問題