私はimp
モジュールをPython 3で使用してモジュールとパッケージをロードできることを知っています。モジュール情報をロードせずに取得するには?
しかし、実際にロードする前に、モジュールに関するいくつかの情報(__version__
など)を取得したいと思います。
この情報はどのように入手できますか?私はimp
に有用な方法が見つかりませんでした。
今のところ、私はimp.find_module
で見つけたファイルを自分自身で解析するよりもよく見えません。
私はimp
モジュールをPython 3で使用してモジュールとパッケージをロードできることを知っています。モジュール情報をロードせずに取得するには?
しかし、実際にロードする前に、モジュールに関するいくつかの情報(__version__
など)を取得したいと思います。
この情報はどのように入手できますか?私はimp
に有用な方法が見つかりませんでした。
今のところ、私はimp.find_module
で見つけたファイルを自分自身で解析するよりもよく見えません。
これは、モジュールが何であるか、インストールされているかどうかなどによって異なります。たとえば、__version__
が必要ですが、モジュールには何も存在しないことが保証されています。 __cached__
、__doc__
、__file__
、__name__
、__package__
など、モジュールにある標準属性はすべてインポート時に作成されます。
モジュールがまだインストールされていない、つまりダウンロードされたtgzなどのものであれば、おそらくsetup.pyファイルを持っていて、それをdistutils
で解凍すればそのディストリビューションから多くの情報を得ることができます。たとえば、pyromaでこれを行います。
インストールされている場合、EGG-INFOディレクトリがある可能性があります。そこには、たくさんの情報を持つたくさんのファイルがあります。そのほとんどはPKG-INFOファイルにあります。これを行うには、各モジュールにDistribute(またはSetuptools)を使用する必要があります。
EGG-INFO/PKG-INFOファイルがない場合は、解析する必要があります。 __version__
の場合は、おそらく正規表現マッチを行うだけです。これはあまり一般的ではありませんが、あなたが探している情報はどれも一般的ではなく、見ているモジュールを正確に把握していなければ存在しないでしょう。
その他の場合は、パーサーが必要な場合があります。 のパーサには良い面がありますが、ast
がおそらくそこでは最適なオプションです。
卵情報は良いアイデアのようです。どのように候補者のモジュールをリストすることができますか?私の最初のアイデアは、モジュールをアプリケーションのサブディレクトリに展開することでした。この場合、単純な 'dir.list()'がリストを生成します。 – rds
@rds:それは間違いなくそれを行う良い方法です。 –
できません。 __version__
は、実行中にモジュールが作成するオブジェクトの名前です。モジュールを定義するファイルを実行するまで存在しません。解析は1つのオプションですが、__version__
を定義するコードが簡単な場合にのみ機能します。
__version__ = 'some literal'
さらに何かが含まれている場合は、コードを少なくとも部分的に実行する必要があります。
モジュールをインポートし、バージョンをチェックし、間違っていると判明した場合は 'sys.modules'から再度削除するのはどうですか?これが何らかの理由でオプションではない場合、 'ast'モジュールでファイルを解析することは、それを自分で解析するよりも確かに優れています。 –
なぜこれが欲しいですか?なぜ答えが変わるのか。 –
私はプラグインマネージャを構築しています。そこには、ロードされた/利用可能なアドオンを表示するAddonManager(現代のブラウザのような)があります。すべてのアドオンは '__version__'と' __desc__'を実装しなければならず、これらの値を「利用可能だがロードされていないアドオン」に表示したい。 – rds