問題-非仮想環境からconda仮想環境に移行すると、コンソールスクリプトのエントリポイントが認識されなくなります。
背景-私は最近、Pythonプロジェクトに仮想環境を使用することについて宗教を得ようとしました。macOS Catalinaにアップデートすると、すべてのPyCharmプロジェクトで無効なインタープリターエラーが表示された後、これを行うことにしました。「大きな混乱を別の混乱の上に投げると、何がうまくいかないのだろうか」と私は思いました。2日後、ようやくスクリプトを再度実行できるようになりました。これは、これまでで最悪のレンガの壁です。どこにも解決策が見つからなかったので、最初のSOの質問とそれに続く解決策を書いています。これは、私が長い間使用してきたこのサイトに貢献する価値のあるものがついにあるのではないかと考えています。
私のセットアップ
コンテキスト-私はいくつかの相互作用するデータサイエンスパッケージを開発し、一般的な方法としてこれらを編集可能なモードでローカルにインストールします。
My_Machine:my_package my_user_name$ pip install -e .
私はsetuptoolsでsetup.pyファイルを使用してPythonパッケージを作成し、PyCharmを使用してビルドします。setup.pyファイル内で、コンソールスクリプトのエントリポイントを次のように定義します。
setup.py:
# -*- coding: utf-8 -*-
from setuptools import setup, find_packages
setup(...
name='my_project',
entry_points={'console_scripts':['my_entry_name=my_package.scripts.my_python_script:main'
]},
...
)
conda仮想環境に移行する前は、次のようなバッチファイルを介してスクリプトを何年も問題なく実行していました。
my_batch_file.command:
#!/bin/bash
cd "$(dirname "$0")" # set the working directory as the command file locations
my_entry_name <script arguments>
ただし、conda仮想環境に移行した後、コマンドファイルを実行するとmy_entry_name: command not found
エラーが発生します。
これまでに試したこと
which python
ターミナルコマンドを使用して、使用するPythonを確認し、設定しようとしました。デフォルトがであることがわかり/Users/my_user_name/anaconda3/bin/python
ます。プロジェクト内のコマンドプロンプトからこれを実行すると/Users/my_user_name/anaconda3/envs/my_env/bin/python
、期待どおりに環境バージョンを反映していることがわかります。/Users/my_user_name/anaconda3/envs/my_env/bin/my_entry_name
、シバン行がPythonバージョンをどのように示しているかを確認しました。#!/Users/my_user_name/anaconda3/envs/my_env/bin/python
これはどれも機能しませんでした-同じmy_entry_name: command not found
エラー。非常にイライラする2日間。
さらに入力して実験した後、回答を修正しました。エントリポイントを定義する実際のファイルがどこにあるかを知る必要がある2つのオプションを見つけました。conda仮想環境の場合、次のようになります。
/anaconda3/envs/my_env_name/bin/entry_point_name
このファイルが呼び出された場合、Pythonのバージョンを指定したり、環境をアクティブ化したりする必要はありません。私はこれを行う2つの方法を見つけました:
オプション1-エントリポイントが正しく呼び出された場合、仮想環境を最初に指摘した@sinorocのクレジットをアクティブ化する必要はありません。conda仮想環境の場合、次のようになります。
my_batch_file.command
#!/bin/bash
cd "$(dirname "$0")" # set the working directory as the command file locations
~/anaconda3/envs/my_env_name/bin/entry_point_name <my script args>
他のタイプの仮想環境の場合は、パスの詳細を調整してエントリポイントファイルにアクセスするだけです。
オプション2-エントリポイントファイルのコピーをメインのAnacondaビンに配置する場合:
/anaconda3/bin/my_entry_name
パスを指定する必要はなく、動作するようにエントリポイントを呼び出すことができます。つまり、スクリプトユーザーを言語から保護し、詳細をインストールします。
my_batch_file.command
#!/bin/bash
cd "$(dirname "$0")" # set the working directory as the command file locations
entry_point_name <my script args>
この手動コピーの手順は洗練されていないため、これをより適切に行う方法について質問を投稿しました。システム全体で利用可能な仮想環境でスクリプトへのエントリポイントを作成するにはどうすればよいですか。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加