ホームページ >バックエンド開発 >Python チュートリアル >上位レベルのディレクトリ モジュールへのインポートと Python での循環インポートの問題
上位ディレクトリにモジュールをインポートします
Pythonでは、インポートモジュールはsys.pathを検索します。sys.pathはリストであり、動的に変更できます。
特定のディレクトリにモジュールをインポートするには、sys.path.insert(0,somedir) を使用して検索パスを追加してからインポートします。
この場合、上位ディレクトリにモジュールをインポートしたい場合は、sys.path.insert(0,parentdir) を使用できます。
ただし、ファイルが他の場所に配置されている場合、絶対パスを記述するこの方法は機能しません。
そのため、動的メソッドを使用して上位レベルのディレクトリを取得します。
import os,sys parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0,parentdir)
sys.path.append(parentdir)の代わりにsys.path.insert(0,parentdir)を使用する理由
検索パスがトラバースされるため、他のパスに同じ名前の名前がある場合paths モジュールを使用すると、インポート エラーが発生します。 sys.path.insert(0,parentdir) を使用して、このパスが最初に検索されるようにします。
循環インポートの問題を解決する
Pythonでは、循環インポート、つまり循環インポートの問題によく遭遇します。
このおかしな状況は現実によく起こります。
ワイヤレス ネットワーク カードをインストールするときは、オンラインにアクセスしてネットワーク カード ドライバーをダウンロードする必要があります。
圧縮ソフトウェアをインストールする場合、インターネットからダウンロードした圧縮ソフトウェア インストール プログラムは実際には圧縮されています。 .
ループの依存関係は次のとおりです。
たとえば、
models.py では、
from server import db class User(db.Model): pass
server.py では、
from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' db = SQLAlchemy(app) from models import User
これにより、循環インポートの問題が発生します。
循環インポートの問題を解決するには、いくつかの主な方法があります。
1. 遅延インポート
インポート ステートメントをメソッドまたは関数に記述して、スコープをローカル領域に制限します。
この方法の欠点は、パフォーマンスの問題が発生することです。
2. xxx import yyy から import xxx;xxx.yyy に変更してアクセスします
3. コードを整理します
循環インポートの問題は、多くの場合、コードのレイアウトに問題があることを意味します。
競合するリソースは結合または分離できます。
マージすると、すべてを1つのファイルに書き込むことができます。
分離とは、サードパーティのファイルにインポートする必要があるリソースを抽出することを意味します。
要するに、ループを一方向に変えます。
上位レベルのディレクトリ モジュールのインポートと Python での循環インポートの問題に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。