問題タブ [import-hooks]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python-3.x - PEP 302 例: 新しいインポートフック
PEP 302で説明されている「新しいインポート フック」の実装例はどこにありますか?
可能な限り上位互換性のあるカスタム ファインダーとローダーを実装したいと考えています。つまり、実装は python 2.x および 3.x で動作するはずです。
python - 同じモジュールを複数回インポートする
数時間後、アプリケーションのバグの原因を発見しました。私のアプリのソースは次のように構成されています。
実際には、あと 50 個ほどのファイルがあります。しかし、それは重要ではありません。にはmain/__init__.py
、次のコードがあります。from folderA.fileA import *
folderA/__init__.py
私はこのコードを持っています:
folderA/fileB.py
私はこのコードを持っています:
問題は、fileA が 2 回インポートされることです。ただし、一度だけインポートしたいです。
これを修正する明白な方法 (少なくとも私にとって) は、特定のパスを から に変更することですpath
。folderA.path
しかし、そもそもPythonでこのエラーが発生するべきではないと思います。各ファイルが絶対的な場所を知る必要がない他の回避策はありますか?
python - Pythonのパッケージ固有のインポートフック
別の言語/フレームワークによって提供されるAPIをPythonにマッピングするPythonモジュールの作成に取り組んでいます。理想的には、これをヘルパーメソッドを公開し、他のフレームワークのすべての名前空間をPythonパッケージ/モジュールにマップする単一のルートパッケージとして提示したいと思います。便宜上、CLRを例として取り上げましょう。
これは、CLR名前空間とサブパッケージ/サブモジュールclr
を公開する魔法のトップレベルパッケージです(私が見る限り、パッケージは子モジュール/パッケージを持つ単なるモジュールです。他の種類のメンバーが含まれていても有効です)。System.Data
System.Windows.Forms
私はPEP-302meta_path
を読み、カスタムフックをインストールすることで同様の効果を実現する簡単なプロトタイププログラムを作成しました。モジュール自体はclr
適切なPythonモジュールであり、インポートされると、設定され__path__ = []
(パッケージになり、import
サブモジュールのルックアップも試行されます)、フックが登録されます。フック自体は、パッケージのフルネームがで始まるパッケージの読み込みをインターセプトし"clr."
、を使用して新しいモジュールを動的に作成しimp.new_module()
、に登録し、sys.modules
ピクシーダストとレインボーを使用して元のAPIのクラスとメソッドで埋めます。コードは次のとおりです。
clr.py
test.py
全体として、これはうまく機能しているようです。Pythonは、チェーン内のモジュールが左から右にインポートされることを保証するため、clr
常に最初にインポートされ、チェーンの残りの部分をインポートできるようにするフックを設定します。
しかし、私がここでやっていることはやり過ぎではないかと思います。結局のところ、私はグローバルフックをインストールしています。これは、気にしないものを除外しても、モジュールのインポートのために呼び出されます。おそらく、特定のパッケージからのインポートに対してのみ呼び出され、他のパッケージからは呼び出されないフックをインストールする方法はありますか?それとも、上記はPythonでこの種のことを行う正しい方法ですか?
python - 動的にロードされたモジュールで定義された関数が見つかりません
私はPythonを初めて使用します。これが私が抱えている問題です。文字列からモジュールをロードするカスタムフックを使用して、組み込みの._import_をフックしました。
次に、モジュールをロードし、execステートメントでその関数を呼び出す関数でこのフックを使用します。
このコードを実行すると、「returnILessons_1(request);」の行に「グローバル名'ajay'が定義されていません」というエラーが表示されます。興味深いのは、Pythonがこの行のすぐ上の行でajayを解決できることです。私はかなり確かに私はexecステートメントでいくつかの間違いを犯していますが、理解することができませんでした。
この問題を解決するのを手伝ってくれませんか。ありがとう
python - Python インポート フック: インポート エラーのトラックバックにファイル名がありません
私はPEP 302に従ってインポート フックを作成しました。存在しないモジュールをインポートしようとするコードなど、インポート エラーが発生した場合、次のような行でトラックバックが表示されます。
10行目は、存在しないインポートへの呼び出しが存在する場所ですが、ファイル名はなく、<string>
. 私のインポートフックは、 PEP 302
の最小のものとほとんど同じです。モジュールの作成では、常に適切な文字列値を に設定し、正しい値が に設定されていることを確認します。また、モジュールのとの両方が有益な情報を返します。__file__
new_module()
__name__
str()
repr()
トラックバック内のこれらの名前のないファイルにより、インポート エラーのデバッグが困難になります。トラックバックはどこからファイル名を取得しますか? モジュールの名前が表示されないのはなぜですか?
編集-もう少し考えてみると、おそらくモジュールコードがを使用して実行されているためexec()
です。exec()
ファイル名を指定することは可能ですか?
python - どのモジュールがどのモジュールをインポートしているかを知る PEP-302 インポート フックを作成します。
foo.py
モジュールがありbar.py
、両方ともimport baz
コードにステートメントがあるとしましょう。
が からインポートされているか、 からインポートされsys.meta_path
ているかを認識できる挿入可能なインポート フックを作成したいと考えています。baz
foo
bar
ClassLoader
これを行う理由は、Java で個別のインスタンスを使用することでできるように、アプリでプラグインを読み込んで依存関係を分離できるようにしたいからです。そうすれば、プラグインfoo
とプラグインは異なるバージョンのライブラリを競合することなくbar
バンドルできます。baz
これを達成する方法は、インポート メカニズムを変更してimport baz
、そのステートメントがどこから来たかに応じてステートメント用の個別のモジュールを生成することです。
誰かがこれを行うためのより良い方法を持っている場合は、回答でそれを提案してください。
python - リモートマシンへのPython出荷パッケージとメモリからのインポート
パッケージをデプロイまたはインストールせずに、リモート マシンで Python パッケージを実行して使用しようとしています。
次のリンクでは、モジュールの文字列インポーターを作成する方法がうまく説明されています。modules ファイルが読み取られ、辞書にテキストとして保存されます。メモリに格納され、StringImporter インポート フックを使用してロードされます。
同じ実装を使用し、モジュールをディクショナリに読み込み、ソケット通信を使用して同じディクショナリを出荷し、リモート マシンで同じ StringImporter を使用してモジュールをインポートできます。
しかし、次のようなパッケージを出荷するのにまだ苦労しています