2017-06-08 15 views
0

Pythonアプリケーションのビルドプロセスでは、ビルドプロセスによって作成されるため、一部のインポートを無視する必要があります。それは私が簡単に解決できない、鶏と卵の質問です。インポート中にPythonモジュールを無視する方法はありますか?

class ImportBlocker(object): 
    def __init__(self, *args): 
     self.module_names = args 

    def find_module(self, fullname, path=None): 
     if fullname in self.module_names: 
      return self 
     return None 

    def load_module(self, name): 
     raise ImportError("%s is blocked and cannot be imported" % name) 

import sys 
sys.meta_path = [ImportBlocker('chickenlib')] 

私はビルドプロセスの停止をエラーを発生させるので、しかし---私は戻って...静かにインポートを無視したい「なし: は、だから、私はこのようにこれを行うには、インポートフックを使用すると考えていました"うまくいきません。 これを行う方法はありますか? 「黙ってインポートを無視する」を参照して

+1

ビルドプロセスのどのような本で、なぜビルドプロセスは、ビルドプロセスが作成されるまで存在しませんモジュールにこの(推移スプリアス?)依存性を持っていますそれら? – user2357112

+2

むしろ、Pythonでインポートを無視しようとすると、依存関係の構造を整理する必要があるように思えます。 – user2357112

+0

「インポートを静かに無視する」とはどういう意味ですか?あなたが目指している正確な効果は何ですか? –

答えて

0

あなたは、Python 3.4以上で作業している場合は、わずかにあなたの例を変更することによって、インポート「を黙って無視する」ことができるより空のモジュールを作成するexec_moduleを実装してください。今

class ImportBlocker(object): 
    def __init__(self, *args): 
     self.module_names = args 

    def find_module(self, fullname, path=None): 
     if fullname in self.module_names: 
      return self 
     return None 

    def exec_module(self, mdl): 
     # return an empty namespace 
     return {} 

>>> import sys 
>>> sys.meta_path = [ImportBlocker('chickenlib')] 

>>> # this will work fine 
>>> import chickenlib 

>>> # there is nothing useful in your imported module 
>>> print(vars(chickenlib)) 
{'__doc__': None, '__package__': '', '__name__': 'chickenlib', '__loader__': <__main__.ImportBlocker object at 0x102b8c470>, '__spec__': ModuleSpec(name='chickenlib', loader=<__main__.ImportBlocker object at 0x102b8c470>)} 
+0

ああ...ありがとう。私はそれを試してみましょう。それにもかかわらず、Python 3.4以下のバージョンでは、空のモジュールを返すことができました - 私はそれをgoogled、ModuleType(name)を返します。 – zet4080

+0

@ zet4080 3.4より下のバージョンでは、空のモジュールを返すために 'load_module'を実装しますが、期待されるすべての属性が設定されていることを注意してください(' load_module'のドキュメントを参照) – donkopotamus

0

、あなたはこれを試すことができます。

def TryImport(module_name): 
    try: 
     import module_name 
    except: 
     pass #or anything to log 
関連する問題