Python メモ: パッケージとモジュール

基本概念

モジュール: 関連する関数のコードのセット (単一の .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 *  导入模块中所有资源
fromimport * 

__ all __ = ["...string name...", "..."] とともに使用すると、リスト内の内容が自動的にインポートされ、呼び出し元にどのモジュール/パッケージが役立つかを通知します。* はリスト内の各文字列要素を表します。
単独で使用すると、アンダースコアで始まらないすべてのリソースがこの場所にインポートされることを意味します。
その時点でどのようなコンテンツがインポートされるかを予測することは不可能であり、変数名の競合が発生しやすいため、使用には注意してください* 。

モジュール検索パス
a. sys.modules [事前にインポートされたすべてのモジュールのキャッシュ] で
検索 b. 組み込みモジュールのリスト [Python、Python 標準ライブラリで事前インストール]
c. sys.path、sys.path で検索次の検索順序を持つ順序付きリストです。

  1. 現在のディレクトリ [現在の実行可能ファイルが配置されているフォルダー。コードを実行するパスには関係ありません]: たとえば、プログラムが /home/zhangsan/test.py に配置されている場合、このプログラムを実行すると、このプログラムの sys.path リストの最初のパスは /home/zhangsan です
  2. 環境変数PYTHON PATHに指定された検索パスの一覧
  3. 特定のパスの下の .pth ファイルに含まれるファイル パスのリスト: 多数の外部パスを追加する必要がある場合に推奨され、永続的に有効です。Python プログラムを開始すると、インタープリターはディレクトリを移動し、pth に遭遇すると、このファイルの内容を読み取り、sys.path に追加します。
  4. 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 に再度インポートする場合は、絶対パスを使用する必要があります

おすすめ

転載: blog.csdn.net/qq_44804542/article/details/116462192