【问题标题】:Pipenv vs setup.pyPipenv vs setup.py
【发布时间】:2018-04-23 22:56:18
【问题描述】:

我正在尝试迁移到 pipenv。我传统上使用setup.pypip 并使用pip install -e . 将模块安装为一个包,这样我就可以从项目中的任何地方实现from myproject.xyz.abc import myClass 之类的东西。

如何实现与pipenv 类似的效果并摆脱setup.py

注意:我使用的是python 2.7

【问题讨论】:

  • pipenv install -e . 不起作用?
  • pipenv 不能替代 distutils
  • @georgexsh 它不起作用。作为一种解决方法,我创建了一个假的setup.py,没有任何依赖或任何东西,然后用pip install -e . 离开了。这让我可以进行包导入。

标签: python pip setuptools pipenv


【解决方案1】:

更新:

pipenv 9.0.0 一直是released,这应该允许您按预期使用pipenv install -e .

原答案:

pipenv install -e 有问题,一直是fixed in master (pull request)。它将在感恩节之后的某个时间在下一个版本中提供。

暂时的解决方法是:

pipenv shell
pip install -e .

发布后,您应该能够运行pipenv install -e .,类似于您对pip 的预期。

【讨论】:

  • 是的..这就是我在过去几天观察到的。看来pipenv 仍在经历许多变化。
【解决方案2】:

更新:2019 年 3 月 5 日: 自 pip 版本 19.03 起,您可以省略 setup.py 为您的包并使用 pyproject.toml[build-system](不支持在可编辑模式下安装(在这种情况下)你仍然需要 setup.py)

更新:2018 年 6 月 12 日:另一个类似的工具 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,才能允许安装它(也可以在可编辑模式下)。

pipenv作者的答案在这里:https://github.com/pypa/pipenv/issues/1161#issuecomment-349972287

因此,pipenv vs setup.py 是一个错误的表述。他们不能互相对抗。宁可互相支持,也可以互相排斥。

我们可能必须想办法在不重复的情况下同时使用它们。

当你构建一个包时,你可能仍然使用 pipenv,但这会导致重复的东西(setup.py 和 Pipfile 中的 requiremets)。我正在使用以下方法来解决这个问题:

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之前要安装!

这不是解决问题的干净方法,但是,做这项工作。

【讨论】:

  • @khan 嗨,请检查一下。现在看来我们有更多关于这方面的信息
  • 这里提到pipenv的作者:github.com/pypa/pipenv/issues/1161#issuecomment-349972287pipenvapplications,而setup.pypackages。在 python 生态系统中你如何区分packages vs apps vs distribution vs libraries
  • 似乎在python生态系统中,由于应用程序构建方式的OO性质,一个包依赖多个模块,一个模块依赖多个类。所以总是存在依赖关系。就像classfunction 高一级,moduleclass 高一级,packagemodule 高一级,app 比@ 高一级987654358@?
  • 作为一个偶尔涉足 Python 生态系统的人,打包和分发部分是绝对的噩梦应该有一种——最好只有一种——明显的方式来做到这一点。 - 我什至不知道如何在bin/ 中使用不同的 Python 代码运行脚本包目录...
  • @Terrabits 我相信当 pip 退出 setup.py 并切换到 pyproject .toml 时类似的事情会得到解决
【解决方案3】:

在您的情况下,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 Pipfilepipenv graph 验证软件包是否已安装。

但是,如果您的包根目录与您的 pipenv 根目录不同,那么pipenv install -e . 将失败并显示一条神秘的错误消息:

错误解析要求。 -- 你确定它可以安装吗?

在这种情况下,您应该从 pipenv 根目录调用 pipenv install -e 并给出包根目录的路径。例如,使用这种文件结构:

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,所以没有多大用处。

【讨论】:

    猜你喜欢
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2023-03-11
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多