3

メインアプリケーションには、ユーザーが有効にできる追加機能がいくつかあります。これらの機能は、独自のディレクトリにあります。これらの機能には、追加の依存関係が必要になる場合があります。requires.txtそれらをそこにファイルに入れることを検討しています。実行時に、機能が壊れるかどうかを人々に知らせたいと考えています。現在、次のようなことを検討しています。

def checkfeature(feature):
  everything_okay = True
  f = pkg_resources.resource_stream(feature, "requires.txt")
  with f:
    for r in pkg_resources.parse_requirements(f):
      if pkg_resources.working_set.find(r) is None:
        print "%r not found, please install, otherwise this feature does not work" % (r,)
        everything_okay = False
  return everything_okay

これは、物事を行うための正しい、パイソン的な方法ですか? これは理にかなっていますか?

小さな更新:なぜそれほど複雑でtry: import ... except ImportError: ...、1つの回答で提案されているのと同じではないのですか:

  1. 私たちのプラグインには、たくさんの依存関係があるかもしれません。以下のような実際のコードを作成するのは非常に冗長です。
  2. 一部のプラグインでは、特定のバージョンのパッケージが必要になる場合があります。パッケージ固有のテストまたはpkg_resourcesとにかく使用する必要があるテスト。そのため、上記の私のアイデアでは pkg_resources を使用しています。
  3. 実行可能なプラグインの単体テストを実行したいと考えています。単体テストで ImportError を処理するのは良くありません。関数can_we_unit_test_this_plugin(plugin)があると、物事が簡単になります。

2 番目の更新:extra_requireではどうsetup.pyですか?

  1. 人々はそれらを頻繁にインストールするのを逃します。わかりました、悪い言い訳です。
  2. 私のビジョンは、個々の機能の個々のサブディレクトリで上記から直接setup.pyロードすることです。しかし、それは本当に次のステップです。extra_requirerequires.txt
4

1 に答える 1