Pythonで不足しているライブラリの自動インポートを実装する

Pythonビデオチュートリアルセクションでは、不足しているライブラリの自動インポートを紹介しています。

インポートの失敗の問題は通常、2つのタイプに分けられます。1つは自分で作成したモジュール(つまり、.pyサフィックスが付いたファイル)をインポートすること、もう1つは3部構成のライブラリをインポートすることです。この記事では、主に2番目の状況について説明しますが、将来機会があれば、他の関連トピックについて詳しく説明します。

Pythonライブラリのインポートに失敗するという問題を解決するには、実際には、不足しているライブラリをランタイム環境にインストールするか(仮想環境かどうかに注意してください)、適切な代替手段を使用することが重要です。この問題は3つの状況に分けられます。

1.単一のモジュールにライブラリがない
コードを作成するときに、サードパーティのライブラリ(リクエストなど)を使用する必要があるが、実際の実行環境にインストールされているかどうかわからない場合は、次のようにします。

try:    import requestsexcept ImportError:    import os

    os.system('pip install requests')    import requests复制代码

これにより、リクエストライブラリが見つからない場合は、最初にインストールされてからインポートされます。

一部のオープンソースプロジェクトでは、次のような記述も見られる場合があります(例としてjsonを取り上げます)。

ry:    import simplejson as jsonexcept ImportError:    import json复制代码

これにより、サードパーティのライブラリsimplejsonが最初にインポートされ、見つからない場合は、組み込みの標準ライブラリjsonが使用されます。

この記述方法の利点は、追加のライブラリをインポートする必要がないことですが、欠点があります。つまり、2つのライブラリの使用に互換性があることを確認する必要があります。標準に代替ライブラリがない場合ライブラリ、それは実行可能ではありません。

互換性のある標準ライブラリが本当に見つからない場合は、モジュール(my_json.pyなど)を自分で作成して目的を達成し、それをexceptステートメントにインポートすることもできます。

ry:    import simplejson as jsonexcept ImportError:    import my_json as json复制代码

コードワードはナンセンスに話すのは簡単ではありません:資料を学ぶ必要がある場合、またはコミュニケーションするための技術的な問題がある場合は「クリック」

次に、プロジェクト全体でライブラリが欠落している
上記のアイデアは開発中のプロジェクト用ですが、いくつかの欠点があります。

1.コードに欠落している可能性のあるすべてのサードパーティライブラリをpipインストールすることはお勧めできません。

2.サードパーティのライブラリを標準ライブラリまたは自分で作成したライブラリに置き換えることができない場合はどうすればよいですか?

3.すでに形成されているプロジェクトでこれらの変更が許可されていない場合はどうすればよいですか?

したがって、ここでの質問は、新しいマシンにデプロイしたいプロジェクトがあります。これには多くのサードパーティライブラリが含まれますが、マシンはプリインストールされていません。どうすればよいですか?

準拠プロジェクトの場合、合意されているように、通常、プロジェクトのすべての依存ライブラリとそれらに必要なバージョン番号を記録する「requirements.txt」ファイルが含まれています。これは、プロジェクトがリリースされる前に、コマンドpipfreeze> requirements.txtを使用して生成されます。

コマンドpipinstall -r Requirements.txt(ファイルが配置されているディレクトリで実行するか、コマンドにファイル全体のパスを書き込む)を使用すると、すべての依存ライブラリを自動的にインストールできます。

ただし、プロジェクトが準拠していない場合、またはその他の不幸な理由により、そのようなドキュメントがない場合は、どうすればよいですか?

愚かな方法は、プロジェクトを実行し、間違いが発生するのを待つことです。ガイドライブラリに障害が発生した場合は、手動でインストールしてからプロジェクトを再実行し、ガイドライブラリに障害が発生したときにインストールします。

3.不足しているライブラリ
を自動的にインポートする不足しているライブラリを自動的にインポートするより良い方法はありますか?

元のコードを変更せずに、「requirements.txt」ファイルを必要とせずに必要なライブラリを自動的にインポートする方法はありますか?

もちろんあります!最初に効果を見てください:
ここに画像の説明を挿入

トルネードを例にとってみましょう。最初のステップでは、トルネードがインストールされていないことがわかります。2番目のステップの後、トルネードが再度インポートされると、プログラムが自動的にトルネードをダウンロードしてインストールするため、エラーは発生しません。報告。

自動インストールは手書きのモジュールで、コードは次のとおりです。

# 以下代码在 python 3.6.1 版本验证通过import sysimport osfrom importlib import import_moduleclass AutoInstall():

    _loaded = set()    @classmethod

    def find_spec(cls, name, path, target=None):

            if path is None and name not in cls._loaded:

                cls._loaded.add(name)

                print("Installing", name)                try:

                    result = os.system('pip install {}'.format(name))                    if result == 0:                        return import_module(name)                except Exception as e:

                    print("Failed", e)            return Nonesys.meta_path.append(AutoInstall)复制代码

このコードではSys.meta_pathが使用されています。最初に印刷して、それが何であるかを確認しましょう。
ここに画像の説明を挿入

Python 3のインポートメカニズムの検索プロセスでは、おおよそのシーケンスは次のとおりです。

sys.modulesを見ると、インポートされたすべてのモジュールがキャッシュされます

sys.meta_pathを見てください、それはカスタムローダーをサポートしています

sys.pathを見ると、いくつかのライブラリが配置されているディレクトリの名前が記録されています。

見つからない場合は、ImportError例外をスローします

sys.meta_pathはPythonのバージョンによって異なることに注意してください。たとえば、Python2とPython3では大きく異なります。新しいPython3バージョン(3.4以降)では、カスタムローダーをfind_specメソッドで実装する必要があります。以前のバージョンではfind_moduleを使用していました。
ここに画像の説明を挿入
上記のコードはカスタムクラスライブラリローダーAutoInstallであり、サードパーティライブラリを自動的にインポートする目的を実現できます。この方法では、新しくインポートされたすべてのライブラリが「ハイジャック」され、元のインポート方法が破壊されるため、奇妙な問題が発生する可能性があることを説明する必要があります。注意してください。

sys.meta_pathは、Pythonプローブのアプリケーションです。プローブまたはインポートフックは、Pythonがほとんど注目しないメカニズムですが、ネットワークへのライブラリの読み込み、モジュールのインポート時のモジュールの変更、不足しているライブラリの自動インストール、監査情報のアップロード、読み込みの遅延など、多くのことを実行できます。 。

スペースに限りがあるため、詳細は説明しません。最終的な要約:

try ...を使用できますが、単純な3部構成のライブラリのインポートまたは置換を実装する場合を除きます。

不足している依存ライブラリ(requirements.txtなど)がすべてわかっている場合は、それらを手動でインストールできます

sys.meta_pathを使用すると、不足しているライブラリを自動的にインポートできます。
この記事は、php中国語のWebサイトのPythonビデオチュートリアルの列からのものです:https//www.php.cn/course/list/30.html

おすすめ

転載: blog.csdn.net/Anna_xuan/article/details/109777364