同じ 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
。アイデアは、オブジェクトを作成してから実行することでしたmod
がf = getattr(mod, "f")
、機能しません
- に変更
sys.path
し['.../past/package/subpackage']
て呼び出すimportlib.import_module('package.subpackage.module')
。問題はsys.path
、おそらく名前package
がすでにsys.modules
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
) は機能せず、「親パッケージが不明な相対インポートを試みました」というエラーが表示されます。