1

同じ Python パッケージの 2 つのバージョンがあります。現在のバージョンのサブパッケージ内のモジュールから、パッケージの古いバージョン (過去に自分自身をコピーしたもの) 内の関数を呼び出せるようにする必要があります。

今いる場所:

now/
  package/
    __init__.py
    subpackage/
      __init__.py
      module.py -> "import package.subpackage.... <HERE>"
    subpackage2/
      ...
    ...

古いバージョン:

past/
  package/
    __init__.py
    subpackage/
      __init__.py
      module.py -> "import package.subpackage; from . import module2; .... def f(x) ..."
      module2.py
    subpackage2/
      ...
    ...

<HERE>「古い」ものをインポートしてf実行する必要があります。

理想的には

  • 関数fは、パッケージの新しいバージョンについて何も知らずに、古いパッケージ内でその生活を送る必要があります
  • 新しいパッケージのモジュールはそれを呼び出し、その寿命を延ばし、結果を取得してから、古いパッケージの存在を完全に忘れる必要があります (したがって、「import package.subpackage2」を呼び出した後f、「新しい」パッケージを実行する必要があります)。バージョン)
  • それを行うことはひどく複雑であってはなりません

根底にあるアイデアは、あるタスクに使用したコードを出力データと共に保存し、その一部を実行できるようにすることで、再現性を向上させることです。

悲しいことに、これは Python 3 での簡単な作業ではないことを理解していたので、何らかの妥協を受け入れる準備ができています。たとえば、古いコードを実行した後、「新しい」コードf(x)の名前が古いコードにバインドされることを受け入れる準備ができています。package

編集

を使用して2つの方法で試しましたimportlib。アイデアは、オブジェクトを作成してから実行することでしたmodf = getattr(mod, "f")、機能しません

  1. に変更sys.path['.../past/package/subpackage']て呼び出すimportlib.import_module('package.subpackage.module') 。問題はsys.path、おそらく名前packageがすでにsys.modules
  2. spec = importlib.util.spec_from_file_location("module", "path..to..past..module.py")) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) その場合、相対インポート ( from . import module2.py) は機能せず、「親パッケージが不明な相対インポートを試みました」というエラーが表示されます。
4

1 に答える 1