pythonパッケージはpypiまたはプライベート倉庫に公開され、ピットを踏むModuleNotFoundError:No module named'keyring.util.Escape等


0.先頭に書く:
私たちが自分で書いたpythonパッケージをカプセル化し、ネットワークに共有して使用するのは、もともと基本的な操作です.しかし、これまで個人的に自分のパッケージのライブラリをpypiにアップロードしたことがなく、ちょうど今回の自分のパッケージの簡単なパッケージがみんなに提供する機会に、できるだけ完全にこの過程を実践し、過程の中でいくつかの穴を踏んだので、ここでは穴を踏む過程を記録します.
1.共有|リリースの準備
0)パッケージのベースディレクトリ構造:
django-jaeger-middleware/
├── django_jaeger_middleware   #            ,            ,         
│   ├── __init__.py
│   ├── metadata.py
│   └── middleware.py
├── LICENSE               # LICENSE, README.md, setup.py                
├── README.md
└── setup.py

1 directory, 6 files


1)setupを作成する.py
setup.pyのファイル
from setuptools import setup, find_packages

#              ,          `setup()`     
MIDDLEWARE_BASE_DIR = os.path.abspath(os.path.dirname(__file__))

meta_file = open(os.path.join(MIDDLEWARE_BASE_DIR, "django_jaeger_middleware", "metadata.py")).read()
md = dict(re.findall(r"__([a-z]+)__\s*=\s*'([^']+)'", meta_file))  #    metadata.py   

with open(os.path.join(MIDDLEWARE_BASE_DIR, 'README.md')) as f:
    long_description = f.read()

setup(
    name='django-jaeger-middleware',
    license='MIT',
    version=md['version'],
    description='                ',
    long_description=long_description,  #     ,       `README.md`  
    long_description_content_type="text/markdown",
    author=md['author'],
    author_email=md['authoremail'],
    url="https://github.com/GalphaXie/django-jaeger-middleware",  #   
    download_url='https://github.com/GalphaXie/django-jaeger-middleware',
    packages=find_packages(),
    install_requires=[
        "jaeger_client",  #              
    ],
    keywords=['django', 'jaeger', 'jaegertracing'], 
    classifiers=[
        "Framework :: Django",
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
    zip_safe=False
)


辞書パラメータの詳細については、公式サイト:1を参照してください.pypi公式サイト対応説明2.pythonの公式サイトの対応説明にはもっと便利な方法があります.成熟したモジュールの書き方を参考にして真似することです.もちろん、私のこのモジュールのホームページを見てもいいです.
2)setup.pyモジュールの文法が正しいかどうかを検査する$ python3 setup.py checkを実行すると、コンソールが表示されます.
running check

表示正确次のステップに進むことができます.
3)README.mdLICENSEの内容を補充する
ヒント:他の人の優れた書き方を参考にして、LICENSEは基本的に公式の三方庫を探してコピーすればいいです.
2.ニーズに応じたパッケージ化|モジュール構築
1)需要一:簡単に分かち合い、xxx.tar.gzを通じて伝達し、pipインストールを使用できない
#     
python3 setup.py build  #       build    
#        
python3 setup.py sdist   #       dist         django_jaeger_middleware.egg-info   
  :          ,             !

現在のディレクトリ構造:
├── build
│   └── lib
│       └── django_jaeger_middleware
│           ├── __init__.py
│           ├── metadata.py
│           └── middleware.py
├── dist
│   └── django-jaeger-middleware-1.0.0.tar.gz
├── django_jaeger_middleware  #     
│   ├── __init__.py
│   ├── metadata.py
│   └── middleware.py
├── django_jaeger_middleware.egg-info
│   ├── dependency_links.txt
│   ├── not-zip-safe
│   ├── PKG-INFO
│   ├── requires.txt
│   ├── SOURCES.txt
│   └── top_level.txt
├── LICENSE
├── README.md
└── setup.py

6 directories, 16 files

モジュールのインストール
  • 1.解凍
  • tar -zxvf     -C        
      : tar -zxvf django-jaeger-middleware-1.0.0.tar.gz        .        `site-packages`      
    
  • 2.取り付け:python3 setup.py install
  • モジュールのアンインストール
  • モジュールに対応する取り付け位置を見つける、rm -r xxxでよい.

  • 2)ニーズ2:pypiを共有することで、より多くの人が使いやすい
    1.モジュールの構築setuptoolswheelモジュールをインストールし、以前にインストールされていた場合は最新に更新でき、公式サイトのpython3 -m pip install --user --upgrade setuptools wheelを統一的に実行します.
  • 1.友情のヒント:それぞれのバージョンと照らし合わせてpython3またはpythonまたはpython2を選択してください.そのバージョンの解釈器を選択してください.後にコンパイルされたのは対応するOS + pythonのバージョンです.
  • 2.友情のヒント:全文はpython解釈器のバージョンについて言及していないので、必要に応じて解釈器のバージョンを調整してください.

  • 2.パブリケーション圧縮パッケージの生成python3 setup.py sdist bdist_wheelが正しく実行されたディレクトリ構造は、次のとおりです.
    .
    ├── build
    │   ├── bdist.linux-x86_64
    │   └── lib
    │       └── django_jaeger_middleware
    │           ├── __init__.py
    │           ├── metadata.py
    │           └── middleware.py
    ├── dist
    │   ├── django_jaeger_middleware-1.0.0-py3-none-any.whl
    │   └── django-jaeger-middleware-1.0.0.tar.gz
    ├── django_jaeger_middleware
    │   ├── __init__.py
    │   ├── metadata.py
    │   └── middleware.py
    ├── django_jaeger_middleware.egg-info
    │   ├── dependency_links.txt
    │   ├── not-zip-safe
    │   ├── PKG-INFO
    │   ├── requires.txt
    │   ├── SOURCES.txt
    │   └── top_level.txt
    ├── LICENSE
    ├── README.md
    └── setup.py
    
    7 directories, 17 files
    

    3.プリリリース
  • 1.配布に必要なツールのインストール:twine、実行python3 -m pip install --user --upgrade twine
  • 2.pypi をリリースする予定ですが、事前に公式サイトに登録する必要がない場合は注意してください.これはテスト公式サイト
  • です.
  • 3.テストバージョンのリリース、実行:python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
  • 4. :もちろん、私はここで穴を踏んで、pypiにissueを持って、ここをクリックして見ることができます.具体的なプロセス
  • 私は変更命令行を実行している間にエラーが発生しました:ModuleNotFoundError: No module named 'keyring.util.escape'、私はエラー全体を詳しく見ました.0.まず私が間違っている環境を紹介します:Ubuntu 18.04のシステム、python 3.6.9、pip 19.0.1のバージョン.1.keyringのソースコードを読んでみて、簡単に読んでからもっと良い手がかりが見つからなかった.2.むやみに振り回して、結果が出ない.3.配布ツールがtwineであるのを見て、ubuntuシステムの下にwinのツールをインストールする必要があると思いました.wineツールをインストールするので、この配布はwinの下でしか操作できないのではないかと疑っています.ubuntuの下では操作できません.これはそんなに合理的ではないように見えますが、winシステムの下で試してみるしかありません.死んだ馬は生きた馬医としていいです.もちろん、この過程には多くの時間と気持ちがかかりました.4.winの下でテストして、私は思い出す前にすべてのコマンドの実行過程をよく見て、確かに何の問題も発見していません.また、実行中のいくつかのwarnningを順次処理したが、やはり今回は順調で、プリリリースのプロセスを実行するとpypiアカウントのパスワードを入力する段階に入った.(具体的な処理のwinningはpipのアップグレードの問題があります;あるスクリプトの環境変数の問題、特にこの環境変数の問題.5.上の環境変数の問題は私に啓示して、私はubuntuの下で私がいくつかのpythonの3つのライブラリのスクリプトを無視してグローバルなpython解釈器の環境の中でないかどうかを確認したいです.コンソールに出力された結果.しかし、私は何のクモの跡も発見しなかった.6.エラーバグは依然として発生している.だから私はやむを得ず真剣にグーグルの中を见て、昨日真剣に见ていない1篇の招待状(招待状の住所)を见て、やむを得ず辛抱強く探して私はついにクモの糸の马迹を见つけました.私がインストールしたkeyringsライブラリのバージョンの問題に合理的な疑問を抱かせ、pip3 install --upgrade keyrings.altコマンドと組み合わせて、私は試みた.
  • 5.何度も振り回して、私は正しい姿勢を見つけました.
  • 1. python3 -m pip install keyring#取付
  • 2.正しくインストールしたらpython 3解釈器に入り、import keyringで同じエラー
  • をインポートしようとします.
  • 3.次に実行:python3 -m pip install --upgrade keyrings.alt
  • 4.正しく実行した後、python 3解釈器に入り、import keyringを導入しようとしたが、コンソールはついにエラーを報告しなかった.私はimport keyring.util.escapeを実行し続け、またエラーを報告し続けた.
  • 5.そして、上記の操作に基づいて、keyring.utilkeyring.util.escapeの2つのパッケージを個別に取り付けるかどうかを合理的に推測します.しかし、この2つのパッケージがpypiの倉庫に単独で存在することはない.また、dir(keyring)dir(keyring.util)を使用して、keyringというパッケージに対応する属性と方法があるかどうかを観察する.発見は:keyring.utilという属性が存在する.
  • 6.keyring.util.escapeがあるかどうかをもう一度見てみると、dirに結果が出て、私は見ませんでした.元のアップロード命令からpython3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*に着手し続け、ついにこの命令も間違っていない.


  • 4.ダウンロードテスト
  • 1.pypi に正常にアップロードされた後、ダウンロードインストールを行い、正しいかどうかを確認します.実行:python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps example-pkg
  • 2.注意パラメータ--no-depsは、インストールするパケットに必要な他の依存パケットを無視することである.(この「穴」を説明します:私たちのバッグは現在pypi に共有されていますが、もし私たちのバッグの中で他の3つのライブラリに依存している場合、これらの3つのライブラリは必ずしもpypi の上に対応するインストールパッケージがあるとは限りません.私たちはこれらのエラーを無視する必要があります.このパラメータを加えなければ、 のエラーを報告します.)
  • 3.ダウンロードsuccessfulを見ると、python解釈器に入ってimport exampleを実行することができ、example-pkgを導入してNo moduleを報告しないと、xxx no moduleのエラーを報告する可能性があるので、無視すればよい.
  • 4.ここでのダウンロード方法も参考にすることができる.

  • 5.pypi正式服アカウントを登録し、正式服にアップロードする.
  • 1.必ず登録と認証を完成しなければならない.そうしないと、後にアップロードするなどの報告が間違っている.大部分は認証が完備していないか、正しくないからだ.
  • 2.実行:twine upload dist/*アップロードできます.url
  • を指定する必要はありません.
  • 3.自分のpypiアカウントに行って調べることができます.

  • 3)需要3:gitlabなどの私有倉庫に共有し、内部で使用する
    1.コードパッケージのコードをgitlab倉庫に公開する
  • 1.公開方法は日常の提出コードと変わらないが、.gitignoreの書き方に注目するには、ここ
  • を参照してください.
    2.インストールと使用
  • 1.一般gitlabのプライベートウェアハウスは暗号化されているため、アカウントのアイデンティティと権限が必要であり、一般的にdeploy token情報を構成する必要がある.
  • 2.具体的なコマンド:pip install -e git+https://{deploy token}@git.ucloudadmin.com/securityhouse/pyservice/django-jaeger-middleware.git#egg=1.0.0
  • 2.1そのうち{deploy token}name:passwordに対応する、注意{}を外す
  • .
  • 2.2 egg=tag 、tagは最新のmasterブランチによって作成される必要がある.setupに対応するもよい.pyのパッケージ名、私の例では1.0.0
  • 2.3上記インストールはデフォルトインストールマスター分岐上の内容であることに注意する、非マスター分岐上の内容をインストールするには上記コマンドの#egg=1.0.0部分を@ #egg= に置き換える必要がある.対応する各符号を見逃さないようにすることが容易である.


  • 3.dockerでdeploy tokenを構成する必要があります.そうしないと、エラーが発生します.
    参考資料:
  • 1.https://bugs.launchpad.net/usd-importer/+bug/1794041
  • 2.https://packaging.python.org/tutorials/packaging-projects/
  • 3.https://docs.python.org/3/distutils/examples.html

  • 本例のURL:
  • 1.https://github.com/GalphaXie/django-jaeger-middleware
  • 2.https://pypi.org/project/django-jaeger-middleware/