インポートされたモジュールをリストする方法は?


152

インポートされたすべてのモジュールを列挙する方法は?

たとえば、私は['os', 'sys']このコードから取得したいと思います:

import os
import sys

:私はそれがネイティブPythonで可能だと思うが、この前の質問のかもしれないのヘルプはありませんstackoverflow.com/questions/2572582/...
parent5446の

6
ときどき(例:でipython --pylab)pythonインタープリターが事前定義されたモジュールがロードされた状態で起動されます。使用されているエイリアスを知る方法についての質問は残りますo_O
yota

回答:


182
import sys
sys.modules.keys()

現在のモジュールのすべてのインポートを取得するための概算はglobals()、モジュールを検査することです。

import types
def imports():
    for name, val in globals().items():
        if isinstance(val, types.ModuleType):
            yield val.__name__

これは、ローカルインポート、またはのような非モジュールインポートを返しませんfrom x import y。これが戻るval.__name__ので、使用した場合は元のモジュール名を取得することに注意してくださいimport module as alias。エイリアスが必要な場合は、代わりに名前を生成します。


2
または、sys.modulesとグローバルの共通部分を見つけて、型テストをまったく行わないようにすることもできます。
Marcin 2013年

これは、インポートしたモジュールの名前を再定義するときに完全なモジュール名を返す唯一のソリューションです。たとえばimport numpy as np、これを行うとnumpy、他の2つの提案が返されますが、これが返されnpます。
joelostblom 2015

1
何らかの理由でモジュール名とエイリアスの両方が必要な場合、これはname変数で使用できます。したがって、文字列を生成するには、yieldステートメントがある場所のimport numpy as npよう'import %s as %s' % (val.__name__, name)にします。
アンドレ・C.アンデルセン

38

交差点検索sys.modulesではglobals

import sys
modulenames = set(sys.modules) & set(globals())
allmodules = [sys.modules[name] for name in modulenames]

1
多分frozenset代わりにここを使用しますか?-ここに私の1-ライナーだ:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
AT

上記のソリューションは、fromコマンドを使用してインポートされているモジュールを抽出しません。たとえばを考えてくださいfrom scipy.stats import norm。これはnormモジュールがインポートされたことを教えてくれません。これをどのように組み込むことができますか?
ウジワル

@Ujjwalまあ、それらのモジュールはインポートされていません。コンポーネントだけです。すべてが必要な場合は、sys.modulesを使用してください。
Marcin

28

スクリプトの外部からこれを行う場合:

Python 2

from modulefinder import ModuleFinder
finder = ModuleFinder()
finder.run_script("myscript.py")
for name, mod in finder.modules.iteritems():
    print name

Python 3

from modulefinder import ModuleFinder
finder = ModuleFinder()
finder.run_script("myscript.py")
for name, mod in finder.modules.items():
    print(name)

これにより、myscript.pyによってロードされたすべてのモジュールが印刷されます。


1
Pythonの3については、変更.iteritems().items()print文のためのブラケット
カルダモン

注:名前空間を処理しているときにクラッシュします:bugs.python.org/issue40350
mPrinC

これ自体、204個の依存関係が私のマシンにあります。
ギムート


8

数学をインポートして、re:

>>import math,re

同じ使い方を見る

>>print(dir())

インポート前とインポート後に実行すると、違いがわかります。


6

それは実際に非常にうまく機能しています:

import sys
mods = [m.__name__ for m in sys.modules.values() if m]

これにより、インポート可能なモジュール名のリストが作成されます。


それは本当に質問に答えません。
bergercookie

4

このコードは、モジュールによってインポートされたモジュールをリストします。

import sys
before = [str(m) for m in sys.modules]
import my_module
after = [str(m) for m in sys.modules]
print [m for m in after if not m in before]

コードを実行するために新しいシステムにどの外部モジュールをインストールするかを知りたい場合に、何度もやり直す必要はありません。

sysそれからインポートされたモジュールはリストされません。


1

@Lilaを盗んで(書式設定がないためコメントを作成できませんでした)、モジュールの/ path /も表示されます。

#!/usr/bin/env python
import sys
from modulefinder import ModuleFinder
finder = ModuleFinder()
# Pass the name of the python file of interest
finder.run_script(sys.argv[1])
# This is what's different from @Lila's script
finder.report()

生成されるもの:

Name                      File
----                      ----

...
m token                     /opt/rh/rh-python35/root/usr/lib64/python3.5/token.py
m tokenize                  /opt/rh/rh-python35/root/usr/lib64/python3.5/tokenize.py
m traceback                 /opt/rh/rh-python35/root/usr/lib64/python3.5/traceback.py
...

.. greppingに適しています。注意してください、それは長いです!


0

この場合、リスト内包表記を使用するのが好きです。

>>> [w for w in dir() if w == 'datetime' or w == 'sqlite3']
['datetime', 'sqlite3']

# To count modules of interest...
>>> count = [w for w in dir() if w == 'datetime' or w == 'sqlite3']
>>> len(count)
2

# To count all installed modules...
>>> count = dir()
>>> len(count)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.