2016-05-17 8 views
-1

"from foo import *"を呼び出すときにインポートするものをリストする方法を教えてください。私はsys.modules.keys()を試しましたが、これはより低レベルのデータ型を提供しています。"foo import *から"を使用するときに読み込まれるもの

+0

あなたはfooで呼び出せるオブジェクトとメソッドと関数のリストをお探しですか? – Ben

+0

私は1つのディレクトリに複数のモジュールがあり、mymodules import *から*実際に何がロードされたのかを知りたいと思います。 – user1767754

+3

そしてなぜ我々はそれをしないのか知っています。 –

答えて

4

あなたは*なしfooをインポートする必要がありますので、あなたはfoo内のすべての名前を取得dirを使用することができます。それは汚染としてfrom foo import *を実行し、

import foo 
print dir(foo) 
+0

これは、['__builtins__'、 '__doc__'、 '__file__'、 '__name__'、 '__package__'、 '__path__']のみを出力しますが、モジュールバーはここにリストしてはいけません。 – user1767754

+0

サブモジュールは親モジュールの一部ではありません。 – Daniel

+0

Allrightどのようにサブモジュールがロードされているのか、またはpartentモジュールの一部であるのか分かりますか? – user1767754

2

を一般的なPythonのルールとしては悪いスタイル(非ニシキヘビ)と考えられています名前空間。

私はあなたの質問にいくつかの考えを与え、ここで私が思い付いたことがあります。今、あなたは、あなたのモジュール/ライブラリfooをインポートし、この関数に渡して、取得することができます

import pkgutil 

def list_all_modules(top_level_package): 
    modnames = [] 
    package = top_level_package 
    prefix = package.__name__ + "." 
    for importer, modname, ispkg in pkgutil.iter_modules(package.__path__, prefix): 
     modnames.append(modname) 
     if ispkg: 
      module = __import__(modname, fromlist="dummy") 
      recurse_modnames = list_all_modules(module) 
      modnames += recurse_modnames 
    return modnames 

を:コピー/ iPythonの便利な%paste魔法の機能を使用してiPythonに以下を貼り付け、またはスクリプトに保存し、それを直接実行しますパッケージfooの下にあるすべての利用可能なモジュール/サブモジュールの一覧(str)を返します。これと同じように:試験として

modnames = list_all_modules(foo) 
print modnames 

、私はhere利用可能html5libライブラリ上でそれを実行します。

In [2]: from pprint import pprint 

In [3]: import html5lib 

In [4]: modnames = list_all_modules(html5lib) 

In [5]: pprint(modnames) 

['html5lib.constants', 
'html5lib.filters', 
'html5lib.filters._base', 
'html5lib.filters.alphabeticalattributes', 
'html5lib.filters.inject_meta_charset', 
'html5lib.filters.lint', 
'html5lib.filters.optionaltags', 
'html5lib.filters.sanitizer', 
'html5lib.filters.whitespace', 
'html5lib.html5parser', 
'html5lib.ihatexml', 
'html5lib.inputstream', 
'html5lib.sanitizer', 
'html5lib.serializer', 
'html5lib.serializer.htmlserializer', 
'html5lib.tokenizer', 
'html5lib.treeadapters', 
'html5lib.treeadapters.sax', 
'html5lib.treebuilders', 
'html5lib.treebuilders._base', 
'html5lib.treebuilders.dom', 
'html5lib.treebuilders.etree', 
'html5lib.treebuilders.etree_lxml', 
'html5lib.treewalkers', 
'html5lib.treewalkers._base', 
'html5lib.treewalkers.dom', 
'html5lib.treewalkers.etree', 
'html5lib.treewalkers.genshistream', 
'html5lib.treewalkers.lxmletree', 
'html5lib.treewalkers.pulldom', 
'html5lib.trie', 
'html5lib.trie._base', 
'html5lib.trie.datrie', 
'html5lib.trie.py', 
'html5lib.utils'] 

これは間違いなくこれを行うための非神託の方法のように感じているが、誰もがより良い方法を持っている場合、私に知らせてください。 :)

関連する問題