3

さて、私は質問があります、私は(このファイルが呼ばれると言う)にincluding多くのファイルに相当するものは何であるか疑問に思っています。たとえば、すべてのファイルを読み取り、含めます。によってインポートされたこれらのファイルに含まれるすべてのファイルは、スクリプト(またはシステム)全体で共有されるようになります。single php fileinit.phpinit.phpDirectory X*.phpinit.php

同様の例ですが、今回は、を読み取るpythonというファイルがあり、find_packages ()を使用する各モジュール(またはパッケージ)は、ファイル内のファイル全体に含まれるなどの行がありますか、またはこれらの各ファイルにこの行が必要ですか?とにアクセスするために?Pythonの例は、PHPの例と同じまたは異なる意味を持ちますか?なぜ?init.pyDirectory Yimportsimport numpy as np, os, sysDirectory Yimportossys

4

1 に答える 1

7

ファイルの場合import、Python は 2 つの異なる手順を実行します。

  1. インポートしたモジュール ファイルを開き、モジュール内importのすべてのステートメントを含めて実行します。
  2. インポートされたモジュールを現在のモジュールの名前空間で使用できるようにします。

fooモジュールをインポートすると、名前空間でによってインポートされたモジュールにアクセスできないことに注意してfooください。直接インポートする必要があります (または 経由foo.moduleでアクセスしますが、通常はモジュールにインポートします)。

つまり、モジュールを使用するすべてのファイルは、同じアプリケーション内の他のファイルがモジュールを使用しfooている場合でも、モジュールをインポートする必要があります。

別の言語から来ている場合に混乱するかもしれないことの 1 つは、Python が特定のモジュールを実際に実行するのは ( を呼び出さない限りreload()) 1 回だけであることです。これが、import上記で up のアクションを 2 つに分割した理由です。最初のアクションは、インポートされたモジュールごとに 1 回だけ実行されますが、2 つ目のアクションは常に発生します。

そのため、import foowhich 自体が実行されると、とimport barの両方が一度ロードされて実行されます。モジュールは にアクセスできますが、インポートしていないためアクセスできません (繰り返しますが、 として使用できますが、通常はあまり良い方法ではありません)。ここで実行すると、モジュールで使用可能になりますが、そのモジュールは既に一度インポートされているため、Python はモジュールを再度ロードして実行しません。foobarfoobarfoo.barimport barbar

詳細が必要な場合は、モジュールの動作の詳細が公式の Python ドキュメントに詳しく記載されています。

それはあなたの質問に答えていますか?

追加の詳細

多くの場合、ディレクトリをスキャンして実行時にモジュールをロードする必要はありませんが、それが役立つ場合があります (プラグインの実装など)。インストールされているモジュールの固定リストから選択するだけの場合は、標準importを実行してキャッチImportErrorし、リストの次を試すことでそれを処理できます。

実行時まで名前がわからないときにモジュールをロードする必要がある場合は、importlib使用できます。Python 標準ライブラリには、モジュールをインポートするための他のモジュールもいくつか用意されています。たとえば、impにはファイル名でモジュールを検索してインポートする機能があります。

そのための解決策がすでにあるように思えますが、他に何が利用できるかを知っておくと便利な場合があります (これらのモジュールはすべて標準ライブラリの一部であるため、常にインストールされます)。

于 2013-01-10T12:01:47.740 に答える