web-dev-qa-db-ja.com

Pipenv対setup.py

pipenvに移行しようとしています。私は伝統的にsetup.pypipと共に使用し、pip install -e .をパッケージとしてインストールして、プロジェクト内のどこからでもfrom myproject.xyz.abc import myClassのようなものを実現できるようにしました。

pipenvで同様の効果を達成し、setup.pyを取り除くにはどうすればよいですか?

注:私はpython 2.7を使用しています。

19
khan

更新:

pipenv 9.0.0は released であり、pipenv install -e .を期待どおりに使用できるはずです。

元の回答:

pipenv install -eはバグがあり、 マスターで修正済みプルリクエスト )です。感謝祭の後の次のリリースで利用可能になるでしょう。

現在の一時的な回避策は次のとおりです。

pipenv Shell
pip install -e .

リリース後、pipで期待するものと同様のpipenv install -e .を実行できるはずです。

19
cs01

更新:2019年3月5日:pipバージョン19.03以降、パッケージのsetup.pyを省略してpyproject.toml[build-system]を使用できます(編集可能モードでのインストールをサポートしていません(この場合、まだsetup.pyが必要です)

更新:2018年6月12日:もう1つの同様のツール https://github.com/takluyver/flitpoetryflitの背後には大きな未来があります。彼らが力を統合し、オールインワンの快適なパッケージとアプリ管理ができることを願っています、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は前にインストールする必要があります!

これは問題を解決するためのきれいな方法ではありませんが、仕事をしてください。

12
Artem Zhukov

あなたの場合、pipenvpipを置き換えますが、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は更新されないため、あまり役に立ちません。

2
FiddleStix