基本概念
モジュール: 関連する関数のコードのセット (単一の .py ファイル) パッケージ
: 複数のモジュールまたはサブパッケージで構成されるフォルダー。通常、ディレクトリには __init__.py ファイルがあります [python3.3 以降は必要ありません]
ライブラリ: 特定の機能を完了するコードのコレクション。パッケージまたはモジュールとして具体化できます。 フレーム
ワーク: 解決するために設計された特定の制約を伴うサポート問題構造。フレームワークを使用すると、問題の骨子をすぐに認識し、それを具体的に埋めていくことができます。
パッケージとモジュールの役割
1. メンテナンスと管理を容易にするために、他のモジュールで使用するためのいくつかの「ホイール」とツール コードを作成します。
2. 同じモジュール内での名前の重複を防止します (各モジュールは別個の名前空間です)
分類
【1】標準パッケージ/モジュール <組み込みモジュール>: Python のインストール時に自動的にインストールされ、os、sys、その他のモジュールなどを直接呼び出すことができます。
【2】サードパーティパッケージ/モジュール:一部の開発者が他の開発者が使用するために開発したモジュール。使用するには、torch、tensorflow などの追加のダウンロードが必要です。
【3】カスタマイズされたパッケージ/モジュール: 自分で作成したモジュールを他の人が使用できるようにリリースすると、サードパーティのパッケージ/モジュールになります。
作成方法
- モジュールの作成: .py ファイルを作成します。
- パッケージの作成: __init__.py ファイルを含むフォルダーを作成します [python3.3 以降は必要ありませんが、作成することをお勧めします]; パッケージをインポートするとき、__init__.py ファイルが最初に実行されます。
- マルチレベルのパッケージを作成する: パッケージ内に別のパッケージを作成します。これは無限にネストできます。
インポート方法【ポイント】
import ステートメントは、他の Python ファイル (モジュールと呼ばれる) をインポートし、モジュール内で定義されたクラス、メソッド、または変数を使用してコードの再利用の目的を達成するために使用されます。
インポート構文 - 通常のインポート
import M ----- 単一のモジュールをインポートします。パッケージ内のモジュールの場合は、ドット構文を使用してモジュールを見つけることができます [package.module]
import M1、M2 ----- カンマで区切って複数のモジュールをインポートします
import M1 as *** ---- モジュールにエイリアスを与え、アクセス プレフィックスを簡素化し、コードのスケーラビリティを強化します
注: xxx_modelu.run() を使用する場合は、リソースのモジュール名を指定する必要があります。
import cv2
import numpy as np
cv2.line(img, (lf_x, pos, color, thickness)
result = np.concatenate((result_1,result_2),1)
パッケージをインポートする場合、デフォルトではモジュールはインポートされません。解決策は 2 つあります。
1. __init__.py ファイルで、必要なモジュールを再度インポートします [パッケージをインポートするとファイルが実行されます]
2. from ** import ** の形式でインポートします
インポート構文 - from ステートメント import
機能: モジュール/パッケージの一部をインポートする
構文: from A import B [as C]
- ルール: インポートは、大きな場所から小さな場所へのみ行うことができます。つまり: パッケージ > モジュール > リソース
- 組み合わせ: パッケージからモジュールをインポート、モジュールからリソースをインポート <インポートをジャンプできません>
- 関係指向: パッケージ内ではモジュールのみが表示されますが、モジュール リソースは表示されません。
栗をあげます:
-- P1[包1]
------sub_P[子包1]
----------- __init__.py [子包1下的init文件]
----------- sub.py [子包1下的模块]
------ __init__.py [包1下的init文件]
------ Tool1.py [包1下的模块]
------ Tool2.py [包1下的模块]
from P1 import Tool1 as t1 #正确
from P1.sub_P import sub #正确
from P1 import sub_P.sub #错误 面向关系:不能调用导入,包中看不到模块资源
特例:
from 模块 import * 导入模块中所有资源
from 包 import *
__ all __ = ["...string name...", "..."] とともに使用すると、リスト内の内容が自動的にインポートされ、呼び出し元にどのモジュール/パッケージが役立つかを通知します。* はリスト内の各文字列要素を表します。
単独で使用すると、アンダースコアで始まらないすべてのリソースがこの場所にインポートされることを意味します。
その時点でどのようなコンテンツがインポートされるかを予測することは不可能であり、変数名の競合が発生しやすいため、使用には注意してください* 。
モジュール検索パス
a. sys.modules [事前にインポートされたすべてのモジュールのキャッシュ] で
検索 b. 組み込みモジュールのリスト [Python、Python 標準ライブラリで事前インストール]
c. sys.path、sys.path で検索次の検索順序を持つ順序付きリストです。
- 現在のディレクトリ [現在の実行可能ファイルが配置されているフォルダー。コードを実行するパスには関係ありません]: たとえば、プログラムが /home/zhangsan/test.py に配置されている場合、このプログラムを実行すると、このプログラムの sys.path リストの最初のパスは /home/zhangsan です
- 環境変数PYTHON PATHに指定された検索パスの一覧
- 特定のパスの下の .pth ファイルに含まれるファイル パスのリスト: 多数の外部パスを追加する必要がある場合に推奨され、永続的に有効です。Python プログラムを開始すると、インタープリターはディレクトリを移動し、pth に遭遇すると、このファイルの内容を読み取り、sys.path に追加します。
- Python インストール パス [仮想環境のサードパーティ パッケージ パス] で Lib ライブラリを検索します。
パスを追加する方法
1. sys.path を直接変更します。sys.path はリストであるため、対応するパスをリストに追加し、insert と append を使用してパスを追加できます。これは動的に追加され、スコープは現在の py ファイルのみであり、複数のファイルが同時に導入される状況には適していません。 2. 環境変数を変更します: PYTHON PATH [変数値はパス]
、これはシェルでのみ有効です。
3. .pth ファイルを追加します。通常は lib site_package の下に保存され、対応するパスがファイルに保存されます。
import sys
sys.path.append('./') #在哪个路径运行脚本/代码,就将该路径添加到sys.path中
sys.path.append('****')
現在含まれているパスを確認する
print(sys.path)
現在ロードされているモジュールを表示する
print(sys.modules)
絶対インポート
1>. 重要なのは、対応するモジュールが検索パスで見つかるかどうかを確認することです。モジュールの検索パスをたどって[主にsys.path内に]見つけます。見つからない場合はエラーが報告されます。実際のプロジェクトでは通常、プロジェクトのルートディレクトリがsys.path以降に追加されます。ここでは、ディレクトリに基づいて絶対インポートが行われます。
2>. インポートするときは関係の問題に注意してください。
3>. import <> または from <> import <> の 2 つの構文を使用できます。
import a
from a import b
相対インポート:
1>. 相対インポートを使用するには、モジュール間の相対位置を知っていて、. を使用して相対パスを表すことだけが必要です。
. : モジュール名から取得したカレントディレクトリ [__ name __]
... : モジュール名から取得した親ディレクトリ
... : モジュール名から取得した親ディレクトリ
2>. 最上位ディレクトリの問題に注意してください。実行可能ファイルと同じディレクトリにあるパッケージは最上位パッケージです。相対インポートは最上位パッケージにまたがることはできません。つまり、最上位パッケージは相互にアクセスできません。[実行可能ファイルの実行方法が異なり、最上位パッケージは-level ディレクトリも異なります。例: python tools/main.py と cd tools & python main.py には異なるトップレベル ディレクトリがあります]
main.py を実行します。つまり、main.py が配置されているディレクトリ内のパッケージ A とパッケージ B はトップレベルのパッケージであり、相対インポートを通じて相互にアクセスできないため、a.py はパッケージ B の b.py をインポートできません。最上位パッケージ間に相互アクセスがある場合、Python インタープリターはエラーを報告します:
ValueError: 相対インポートが最上位パッケージを超えて試みられました
この時点では、絶対インポートを考慮できます。
3>. 相対インポートは、インポートされたモジュールでのみ使用できます。相対インポート ステートメントを含むモジュールは直接実行できません。これは、モジュールが直接実行される場合、Python はこのモジュールを最上位モジュールとみなし、階層がないため、他の相対パスを見つけることができません。
4>. 相対インポートでは、<> import <> の構文のみを使用でき、先頭のポイントとして . を使用できます。
5>. モジュールでは、属性 __ package __ を通じて独自のパッケージ情報、つまりモジュールが配置されているパッケージの構造 (XXX、XXX.YYY.ZZZ など) を取得できます。 __ package __ が None の場合、モジュールがトップレベルのモジュールであることを示します。モジュールの場所は、モジュールの __ name __ 属性によって決まります。__ main __ の場合、それはパッケージ構造のないトップレベル モジュールです。ABC 構造の場合、トップレベル モジュールは次のとおりです。 A.
6>. パッケージ メンテナンスのための相対インポートの利点: 相対インポートにより、ハード コーディングによって引き起こされるパッケージ メンテナンスの問題を回避できます。たとえば、パッケージの特定の層の名前を変更すると、そのサブパッケージに対する他のモジュールのすべての絶対インポートが行われます。は利用できませんが、相対インポート ステートメントを使用するモジュールはこの問題を回避します。
異なるパスの場所からコードを実行すると、主に 2 つの場所に影響します
: 1.sys.path.append('./')
2. 相対インポート中のトップレベル ディレクトリ
モジュールがインポートされた後はどのような操作が実行されますか?
初めてのインポート
1. インポートされたモジュールの名前空間内のすべてのコードを実行します [モジュール全体をインポートするか、関数によってモジュール内のすべてのコードが実行されます] 2. モジュール オブジェクトを作成し、モジュール内のすべてのトップレベル変数
を属性の形式 [Object.Method アクセスを渡すことができます] オブジェクトにバインドします
3. インポート位置で、名前空間にインポート後の変数名を導入します [つまり、モジュール オブジェクトを導入すると使用できます]
2回目のインポート
ステップ 3 に直接進みます
モジュールまたはモジュール リソースがパッケージからインポートされるかどうかに関係なく、モジュール内のすべてのコードが実行されます。パッケージが直接インポートされる場合は、どのモジュール/モジュール リソースがパッケージ内の __init__.py によってインポートされるか、そのモジュール内のすべてのコードが実行されます。他のモジュールは実行されません。モジュールを __init__.py に再度インポートする場合は、絶対パスを使用する必要があります