2

Pythonスクリプトから動的にインポートされたモジュールをどのように取得(場所を見つける)しますか?

したがって、私の理解では、python は動的に (実行時に) モジュールをロードできます。_ import _(module_name)を使用するか、exec "from x import y"を使用し、imp.find_module ("module_name")を使用してからimp.load_module(param1, param2, param3, param4)を使用します。

Pythonファイルのすべての依存関係を取得したいことを知っています。これには、動的にロードされたモジュール、ハードコードされた文字列オブジェクトを使用してロードされたモジュール、または関数/メソッドによって返されたモジュールの取得 (または少なくとも試みた) が含まれます。

通常のimport module_nameおよびfrom x import yでは、コードを手動でスキャンするか、module_finder を使用できます。

1 つの Python スクリプトとそのすべての依存関係 (動的にロードされたカスタム モジュールを含む) をコピーしたい場合、どうすればよいでしょうか?

4

5 に答える 5

3

できません; (どの言語でも) プログラミングの性質上、実際に実行しないとどのコードが実行されるかを予測することはできません。したがって、どのモジュールを含めることができるかを知る方法はありません。

これは、ユーザー入力によってさらに混乱します__import__(sys.argv[1])

最初の問題については多くの理論的情報があり、これは通常Halting problemとして説明されますが、2 番目の問題は明らかに実行できません。

于 2011-09-16T08:08:32.197 に答える
2

理論的な観点からは、どのモジュールがどこにインポートされているかを正確に知ることはできません。実用的な観点から、単にモジュールの場所を知りたい場合は、module.__file__属性を確認するか、スクリプトを実行してpython -v、モジュールがロードされたときにファイルを見つけます。これにより、ロードされる可能性のあるすべてのモジュールが得られるわけではありませんが、ほとんどのモジュールでほとんど正常なコードが得られます。

関連項目: Python モジュール ソースの場所を見つけるにはどうすればよいですか?

于 2011-09-16T08:22:48.443 に答える
1

これを 100% 正確に行うことはできません。ここで同様の質問に答えました: Python による依存関係テスト

于 2011-09-16T08:07:27.393 に答える
1

単なるアイデアであり、それが機能するかどうかはわかりません:

のラッパーを含むモジュールを作成できます__builtin__.__import__。このラッパーは、old への参照を保存してから、次のことを__import__行う関数を に割り当て__builtin__.__import__ます。

  1. 呼び出されるたびに、現在のスタックトレースを取得し、呼び出し元の関数を解決します。globalsパラメータ toの情報で__import__十分かもしれません。
  2. その呼び出し関数のモジュールを取得し、このモジュールの名前とインポートされるものを保存します
  3. 通話を本物にリダイレクトする__import__

これを行った後、アプリケーションを で呼び出すことができますpython -m magic_module yourapp.py。マジック モジュールは、後で取得できる場所に情報を保存する必要があります。

于 2011-09-16T08:44:14.410 に答える
0

それはかなりの質問です。

静的分析とは、可能なすべてのランタイム実行パスを予測し、特定の入力に対してプログラムが停止することを確認することです。

これはHalting Problemと同等であり、残念ながら一般的な解決策はありません。

動的な依存関係を解決する唯一の方法は、コードを実行することです。

于 2011-09-16T08:27:03.717 に答える