2012-01-11 8 views
2

私はimpモジュールをPython 3で使用してモジュールとパッケージをロードできることを知っています。モジュール情報をロードせずに取得するには?

しかし、実際にロードする前に、モジュールに関するいくつかの情報(__version__など)を取得したいと思います。

この情報はどのように入手できますか?私はimpに有用な方法が見つかりませんでした。

今のところ、私はimp.find_moduleで見つけたファイルを自分自身で解析するよりもよく見えません。

+0

モジュールをインポートし、バージョンをチェックし、間違っていると判明した場合は 'sys.modules'から再度削除するのはどうですか?これが何らかの理由でオプションではない場合、 'ast'モジュールでファイルを解析することは、それを自分で解析するよりも確かに優れています。 –

+0

なぜこれが欲しいですか?なぜ答えが変わるのか。 –

+0

私はプラグインマネージャを構築しています。そこには、ロードされた/利用可能なアドオンを表示するAddonManager(現代のブラウザのような)があります。すべてのアドオンは '__version__'と' __desc__'を実装しなければならず、これらの値を「利用可能だがロードされていないアドオン」に表示したい。 – rds

答えて

1

これは、モジュールが何であるか、インストールされているかどうかなどによって異なります。たとえば、__version__が必要ですが、モジュールには何も存在しないことが保証されています。 __cached____doc____file____name____package__など、モジュールにある標準属性はすべてインポート時に作成されます。

モジュールがまだインストールされていない、つまりダウンロードされたtgzなどのものであれば、おそらくsetup.pyファイルを持っていて、それをdistutilsで解凍すればそのディストリビューションから多くの情報を得ることができます。たとえば、pyromaでこれを行います。

インストールされている場合、EGG-INFOディレクトリがある可能性があります。そこには、たくさんの情報を持つたくさんのファイルがあります。そのほとんどはPKG-INFOファイルにあります。これを行うには、各モジュールにDistribute(またはSetuptools)を使用する必要があります。

EGG-INFO/PKG-INFOファイルがない場合は、解析する必要があります。 __version__の場合は、おそらく正規表現マッチを行うだけです。これはあまり一般的ではありませんが、あなたが探している情報はどれも一般的ではなく、見ているモジュールを正確に把握していなければ存在しないでしょう。

その他の場合は、パーサーが必要な場合があります。 のパーサには良い面がありますが、astがおそらくそこでは最適なオプションです。

+0

卵情報は良いアイデアのようです。どのように候補者のモジュールをリストすることができますか?私の最初のアイデアは、モジュールをアプリケーションのサブディレクトリに展開することでした。この場合、単純な 'dir.list()'がリストを生成します。 – rds

+0

@rds:それは間違いなくそれを行う良い方法です。 –

4

できません。 __version__は、実行中にモジュールが作成するオブジェクトの名前です。モジュールを定義するファイルを実行するまで存在しません。解析は1つのオプションですが、__version__を定義するコードが簡単な場合にのみ機能します。

__version__ = 'some literal' 

さらに何かが含まれている場合は、コードを少なくとも部分的に実行する必要があります。

関連する問題