Python :プロジェクト環境の設定


Cover Image By Unsplash



導入
私は本当にパイソンが大好き!それは非常にシンプルで簡単ですので.そこで、Pythonに関連する設定やツールを共有します.
セットアップに必要なすべてのコードを見たい場合はrepository アップロード!
それで、あなたは旅行の準備ができていますか?🚀 始めましょう!

始める

パイン
pyenvはsimple python version management ツール.簡単に特定のPythonバージョンをダウンロードしたり変更したりできます.
pyenvは様々なインストール方法を提供します.ここでは、自動インストーラを使用してインストールしますpyenv-installer )
それでは、Pyenvのインストールを始めましょう!
$ curl https://pyenv.run | bash
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   285  100   285    0     0    274      0  0:00:01  0:00:01 --:--:--   274

...

WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by adding
# the following to ~/.bashrc:

export PATH="/home/vagrant/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
インストールが完了したら、いくつかの設定を行う必要があります.
主にzshを使うので、環境変数を.zshrc ファイル:
# .zshrc

...

## Pyenv
export PATH="/home/vagrant/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
次に、環境を適用します.source .zshrc ) またはシェルを再起動します.
vagrant in ~ at arch
➜ pyenv
pyenv 1.2.21
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   activate    Activate virtual environment
   commands    List all available pyenv commands
   deactivate   Deactivate virtual environment
   doctor      Verify pyenv installation and development tools to build pythons.
   exec        Run an executable with the selected Python version
   global      Set or show the global Python version(s)
   help        Display help for a command

...
グッド!ここでPyenvを通してPythonバイナリを管理できます.しかしPyEnvを使ってPythonをインストールしようとすると、依存関係のため失敗します.この場合、公式を参照documentation .

用途
$ pyenv versions # List all Python versions available to pyenv
* system (set by /home/vagrant/.pyenv/version)

$ pyenv install --list # List all available versions
Available versions:
  2.1.3
  2.2.3
  2.3.7
    ...

$ pyenv install 3.9.0 # Install specific python version
Downloading Python-3.9.0.tar.xz...
-> https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tar.xz
Installing Python-3.9.0...
Installed Python-3.9.0 to /home/vagrant/.pyenv/versions/3.9.0

$ pyenv versions
* system (set by /home/vagrant/.pyenv/version)
3.9.0

$ pyenv global 3.9.0 # Set or show the global Python version(s)
$ pyenv versions
system (set by /home/vagrant/.pyenv/version)
* 3.9.0

$ python --version
Python 3.9.0


poetry Pythonの依存性管理です.ほとんどのプログラミング言語には依存関係やパッケージマネージャと呼ばれるものがあります.例えば、JavaScriptのNPM、錆の貨物など.
もちろん、pip はPythonに既に存在します.だからなぜ詩、ピップではない?
PIPには以下の問題があります.
  • 依存性解決
  • (非決定性)依存ロック
  • 仮想環境virtualenv )
  • 詩は、上記の問題を解決することができる新しい依存管理ツールです.では、簡単なサンプルプロジェクトで詩を始めましょう!
    $ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python # Install using script
    
    $ poetry -V # need to configure PATH environment '$HOME/.poetry/bin'
    Poetry version 1.1.2
    
    インストール後、サンプルプロジェクトフォルダを作成しますpoetry-example そして、詩でプロジェクトを初期化してください
    $ poetry new poetry-example
    Created package poetry_example in poetry-example
    
    $ cd poetry-example && ls --tree
    .
    ├── poetry_example
    │  └── __init__.py
    ├── pyproject.toml
    ├── README.rst
    └── tests
       ├── __init__.py
       └── test_poetry_example.py
    
    グッド!現在poetry-example 詩を使用するプロジェクトです!では、インストールしましょうrequests パッケージ.
    $ poetry add requests # install package
    Creating virtualenv poetry-example-mO5WhdNK-py3.9 in /home/meow/.cache/pypoetry/virtualenvs
    Using version ^2.24.0 for requests
    
    Updating dependencies
    Resolving dependencies... (3.1s)
    
    Writing lock file
    
    Package operations: 14 installs, 0 updates, 0 removals
    
      • Installing pyparsing (2.4.7)
      • Installing six (1.15.0)
      • Installing attrs (20.2.0)
      • Installing certifi (2020.6.20)
      • Installing chardet (3.0.4)
      • Installing idna (2.10)
      • Installing more-itertools (8.5.0)
      • Installing packaging (20.4)
      • Installing pluggy (0.13.1)
      • Installing py (1.9.0)
      • Installing urllib3 (1.25.10)
      • Installing wcwidth (0.2.5)
      • Installing pytest (5.4.3)
      • Installing requests (2.24.0)
    
    $ ls
    poetry.lock  poetry_example  pyproject.toml  README.rst  tests
    
    を、今見ることができますpoetry.lock ファイル.既定では、詩はキャッシュディレクトリに仮想環境を作成します.
    $ pwd
    /home/vagrant
    
    $ ls .cache/pypoetry/virtualenvs
    poetry-example-mO5WhdNK-py3.9
    
    VirtualEnvディレクトリをローカルプロジェクトフォルダに変更する場合は、virtualenvs.in-project configuration .

    スタイルチェッカー&コードフォーマッタ
    スタイルチェッカー&コードフォーマッタは、コードの品質を向上させることができるツールです.Python ECOシステムにはさまざまなツールがありますが、ここでは最も使われているものを選びました.

    ブラック
    Black is the uncompromising Python code formatter Pythonソフトウェア財団によって提供されます.ブラックに代わるものはyapf , Googleによって配布されます.両方のツールは自分の強みと弱点を持っていますが、私の個人的な意見では、黒は使いやすいです.
    $ pwd
    /home/vagrant/Projects/poetry-example
    
    $ poetry add -D black # Install black as development dependency
    
    インストール済みblack 使用-D オプション.このオプションはパッケージをdev依存性として追加します.ほとんどの場合、スタイルチェッカーまたはコードフォーマッタは、プロジェクトの一部として発行される必要はありません.
    次に、テスト用のサンプルファイルを作成します.
    $ cat poetry_example/main.py
    def main():
        print("Hello World");
    
    if __name__ == "__main__":
        main()
    
    $ python poetry_example/main.py
    Hello World
    
    $ poetry run black poetry_example/main.py
    reformatted poetry_example/main.py
    All done! ✨ 🍰 ✨
    1 file reformatted.
    
    $ cat poetry_example/main.py
    def main():
        print("Hello World")
    
    if __name__ == "__main__":
        main()
    
    前と黒を使用した後の違いを見つけましたか?
    黒を実行する前にmain.py print文の後にセミコロンを含みます.セミコロンはPythonの実行には影響しませんが、特殊な場合を除き、Pythonはセミコロンを使用しません.
    それで、黒を実行した後に、我々はセミコロンがmain.py
    フレーク8 & ISort
    flake8 PythonスタイルチェッカーはPEP8(Python Enhance Proposal 8) . ブラックは良いコードフォーマッタです.しかし、ドキュメント文字列のようないくつかの項目は、チェックオプションを提供していません.フリーク8だけでなく、黒の不足のために役立ちますも簡単に黒で適用することができます.
    isort また、Flek 8に類似したツールであり、このツールはアルファベット順にインポートをソートし、自動的にセクションに分かれて、型によって.
    それで、両方のツールをブラックで使いましょう.
    $ pwd
    /home/vagrant/Projects/poetry-example
    
    $ poetry add -D flake8 isort # Install packages
    
    # poetry_example/main.py
    
    from pprint import PrettyPrinter, pformat, isreadable # Expected sorts alphabetically
    
    def Empty():
        raise NotImplemented # Expected Warning - F901
    
    def main():
        pp = PrettyPrinter(indent=4)
        pp.pprint(["Hello", "World"])
    
    if __name__ == "__main__":
        main()
    
    テスト文を追加して実行します.
    $ python poetry_example/main.py
    ['Hello', 'World']
    
    $ poetry run black poetry_example/main.py
    All done! ✨ 🍰 ✨
    1 file left unchanged.
    
    $ poetry run flake8
    ./poetry_example/main.py:3:1: F401 'pprint.pformat' imported but unused
    ./poetry_example/main.py:3:1: F401 'pprint.isreadable' imported but unused
    ./poetry_example/main.py:7:5: F901 'raise NotImplemented' should be 'raise NotImplementedError'
    
    $ poetry run isort poetry_example/main.py
    Fixing /home/meow/Projects/poetry-example/poetry_example/main.py
    
    $ head -5 poetry_example/main.py
    from pprint import PrettyPrinter, isreadable, pformat # Changed!
    

    (オプション) Pipx
    Python ECOシステムには多くのアプリケーションやパッケージがあります.例えば、パッケージはTensorFlow and Django , とアプリケーションが含まれますJupyter and Ansible .
    ほとんどの場合、我々はpip アプリケーションとパッケージをダウンロードします.このアプローチはばかげた状況を作り出す.PIPは環境隔離のない汎用パッケージインストーラです.
    それで[pipx](https://github.com/pipxproject/pipx) これらの状況を解決するためのツールです.
    $ python3 -m pip install --user pipx # install via pip
    $ python3 -m pipx ensurepath
    
    # Example
    $ pipx install bpytop
    installed package bpytop 1.0.42, Python 3.9.0
      These apps are now globally available
        - bpytop
    done! ✨ 🌟 ✨
    
    $ which bpytop
    /home/vagrant/.local/bin/bpytop
    

    ビジュアルスタジオコード
    Visual Studioのコードは私のお気に入りのコードエディタの一つです.特に、vscodeはPythonと非常に互換性があると思います.
    そこで、サンプルプロジェクトを使ってVSCodeで紹介したツールの使い方を紹介します.まず、新しいプロジェクトを作りましょう.
    $ poetry new python-boilerplate && cd python-boilerplate
    
    $ poetry config virtualenvs.in-project true --local # change virtualenv location to local
    
    $ poetry add -D black flake8 isort
    
    $ touch setup.cfg # for flake8 configuration
    
    $ ls -a
    .venv  poetry.lock  poetry.toml  pyproject.toml  python_boilerplate  README.rst  setup.cfg  tests
    
    詩のセクションで以前に説明したように、詩は自動的にvirtualenv キャッシュディレクトリのフォルダ.
    これらの場合、VSCodeはVirtualEnvディレクトリに簡単にアクセスできません.だから私はvirtualenvs.in-project オプションを簡単にアクセスできるようにするvenv vscodeのフォルダ.
    設定を設定する準備が整いました.まず、インストールPython extension for Visual Studio Code を作成し、.vscode/settings.json ファイル.
    {
        // VSCode
        "[python]": {
            "editor.formatOnSave": true,
            "editor.codeActionsOnSave": {
                "source.organizeImports": true
            }
        },
        // Python Extension
        "python.venvPath": "./.venv",
        "python.linting.pylintEnabled": false,
        "python.linting.flake8Enabled": true,
        "python.formatting.provider": "black",
        "python.linting.enabled": true,
    }
    
    グッド!現在、lintはPythonファイルに自動的に適用されます.

    (オプション)型チェッカー/ヒント
    誰もが知っているように、Pythonは動的にタイプされた言語です.これらの機能は長所と短所を持っていますが、一部のユーザーは静的にタイプされた言語のようにPythonを望みます.
    これを補うために、Pythonはタイプヒントをサポートしますtyping ) バージョン3.5以降.しかし、文書はこう言います.

    The Python runtime does not enforce function and variable type annotations. They can be used by third party tools such as type checkers, IDEs, linters, etc.


    したがって、サポートヒントをサポートするいくつかのツールがあります.
  • mypy
  • pyright
  • pyre-check
  • すべての3つのツールは、タイプチェックに適しています.しかし、これらの中で、私は個人的にPalightを好む.

    ピライト
    Pyrightはマイクロソフトが開発したスタティック型チェッカーです.私がpyightを好む最も大きい理由はそれがVSCodeを通して簡単に適用されることができるということです.単にインストールしようとするPyright extension と作成pyrightconfig.json
    {
        "include": [
            "python_boilerplate"
        ],
        "exclude": [
            "**/__pycache__"
        ],
    
        "reportMissingImports": "error",
        "reportMissingTypeStubs": "none"
    }
    
    これはサンプルの設定です.Pyrightは様々なオプションを提供します.詳しくはオフィシャルサイトをご覧くださいdocumentation .
    を作成し、main.py テスト用
    def sayHello(name: str) -> str:
            return 0 # Error!
    
    VSCodeは、その関数の戻り値で次の問題を表示します
    Expression of type "Literal[0]" cannot be assigned to return type "str"
      "Literal[0]" is incompatible with "str"
    

    結論
    Pythonの最大の利点は、誰でも簡単にエディタだけでプログラムすることができるということです.したがって、上記の設定は必要ありません!
    しかし、私はそれが上記の情報を必要とする誰にでも役立つことを望みます.
    読書ありがとう😆