pipenv
に移行しようとしています。私は伝統的にsetup.py
をpip
と共に使用し、pip install -e .
をパッケージとしてインストールして、プロジェクト内のどこからでもfrom myproject.xyz.abc import myClass
のようなものを実現できるようにしました。
pipenv
で同様の効果を達成し、setup.py
を取り除くにはどうすればよいですか?
注:私はpython 2.7
を使用しています。
更新:2019年3月5日:pipバージョン19.03以降、パッケージのsetup.pyを省略してpyproject.toml
と[build-system]
を使用できます(編集可能モードでのインストールをサポートしていません(この場合、まだsetup.pyが必要です)
更新:2018年6月12日:もう1つの同様のツール https://github.com/takluyver/flitpoetry
とflit
の背後には大きな未来があります。彼らが力を統合し、オールインワンの快適なパッケージとアプリ管理ができることを願っています、Rust cargo
更新:2018年4月19日:setup.pyを必要とせずに、すべてのパッケージング管理を一度に処理できる同様のツールがあります。これは https://github.com/sdispater/poetry
更新:2018年4月11日:Pipenvの作者はここで問題を説明しています: http://pipenv.readthedocs.io/en/latest/advanced /#pipfile-vs-setup-py
Setup.pyのないパッケージでpipenv install -e .
を実行すると、以下が得られます:
$ pipenv install -e .
Directory '.' is not installable. File 'setup.py' not found.
とにかくそのような場合にはsetup.py
が必要です。
アプリケーションとパッケージの背後にある概念を理解することが重要です。この情報は役に立つかもしれません https://caremad.io/posts/2013/07/setup-vs-requirement/
アプリケーションを構築している場合、必要なのはpipenv
だけです。
ただし、パッケージをビルドする場合は、とにかくsetup.py
を使用して、pipまたはpipenvのインストールを許可する必要があります(編集可能モードでも可能)。
pipenv
の作成者による回答はこちらです: https://github.com/pypa/pipenv/issues/1161#issuecomment-349972287
したがって、pipenv vs setup.py
は間違った定式化です。彼らはお互いに反対することはできません。むしろお互いをサポートするか、お互いを除外します。
重複することなく、両方を使用する方法を見つける必要があるかもしれません。
パッケージをビルドしているときでも、pipenvを使用できますが、これは重複するものにつながります(setup.pyおよびPipfileの要件)。これに対処するために、次のアプローチを使用しています。
import pathlib
import subprocess
from setuptools import setup, find_packages
from setuptools.command.install import install
from setuptools.command.develop import develop
__requires__ = ['pipenv']
packages = find_packages(exclude=['tests'])
base_dir = pathlib.Path(__file__).parent
pipenv_command = ['pipenv', 'install', '--deploy', '--system']
pipenv_command_dev = ['pipenv', 'install', '--dev', '--deploy', '--system']
class PostDevelopCommand(develop):
"""Post-installation for development mode."""
def run(self):
subprocess.check_call(pipenv_command_dev)
develop.run(self)
class PostInstallCommand(install):
"""Post-installation for installation mode."""
def run(self):
subprocess.check_call(pipenv_command)
install.run(self)
with open(base_dir / 'README.md', encoding='utf-8') as f:
long_description = f.read()
setup(
name='dll_api',
use_scm_version = True,
long_description='\n' + long_description,
packages=packages,
setup_requires=['setuptools_scm'],
cmdclass={
'develop': PostDevelopCommand,
'install': PostInstallCommand,
},
)
これで次のことができました。
$ python setup.py install
running install
Installing dependencies from Pipfile.lock (e05404)…
注pipenv
は前にインストールする必要があります!
これは問題を解決するためのきれいな方法ではありませんが、仕事をしてください。
あなたの場合、pipenv
はpip
を置き換えますが、setup.py
が必要です。
ディレクトリが次のように構成されていると仮定します。
dir_a/ <-- This will be your pipenv root dir and your package root dir.
setup.py
dir_b/
__init__.py
somefile.py
otherfile.py
次に、Python 3環境を開始し、以下を使用してパッケージをインストールできます。
$> cd dir_a
$> pipenv --python 3
$> pipenv Shell
$> pipenv install -e .
cat Pipfile
またはpipenv graph
を使用して、パッケージがインストールされたことを確認できます。
ただし、パッケージのルートディレクトリがpipenvのルートディレクトリと異なる場合、pipenv install -e .
は失敗します不可解なエラーメッセージが表示されます。
要件の解析エラー。 -本当にインストール可能ですか?
この場合、pipenv install -e
をpipenvルートディレクトリから呼び出し、パッケージのルートディレクトリへのパスを指定する必要があります。たとえば、次のファイル構造の場合:
dir_z/ <-- This will be your pipenv root dir.
something.py
empty_dir/
dir_a/ <-- This is your package root dir.
setup.py
dir_b/
__init__.py
somefile.py
otherfile.py
次を使用します。
$> cd dir_z
$> pipenv --python 3
$> pipenv Shell
$> pipenv install -e dir_a/
別のユーザーが述べたように、pip install -e .
を使用すると、このシナリオでdir_a
から仮想環境にパッケージがインストールされます。ただし、少なくとも私にとっては、Pipfile
は更新されないため、あまり役に立ちません。