Pipenv 对比 setup.py
Pipenv vs setup.py
我正在尝试迁移到 pipenv
。我传统上使用 setup.py
和 pip
并使用 pip install -e .
将模块安装为一个包,这样我就可以从项目中的任何地方实现 from myproject.xyz.abc import myClass
之类的东西。
如何实现与 pipenv
类似的效果并去掉 setup.py
?
注意:我正在使用 python 2.7
。
更新:
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
的期望。
更新:2019 年 3 月 5 日: 自 pip 版本 19.03 起,您可以为您的包省略 setup.py 并使用 pyproject.toml
和 [build-system]
(不支持在可编辑模式下安装(此时你还需要setup.py)
更新:2018 年 6 月 12 日: 另一个类似的工具 https://github.com/takluyver/flit。 poetry
和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
如果您 运行 pipenv install -e .
在一个没有 setup.py 的包裹中,那么您将得到:
$ 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 .
将失败 并出现一条神秘的错误消息:
Error parsing requirement . -- are you sure it is installable?
在这种情况下,您应该从 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
所以用处不大。
我正在尝试迁移到 pipenv
。我传统上使用 setup.py
和 pip
并使用 pip install -e .
将模块安装为一个包,这样我就可以从项目中的任何地方实现 from myproject.xyz.abc import myClass
之类的东西。
如何实现与 pipenv
类似的效果并去掉 setup.py
?
注意:我正在使用 python 2.7
。
更新:
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
的期望。
更新:2019 年 3 月 5 日: 自 pip 版本 19.03 起,您可以为您的包省略 setup.py 并使用 pyproject.toml
和 [build-system]
(不支持在可编辑模式下安装(此时你还需要setup.py)
更新:2018 年 6 月 12 日: 另一个类似的工具 https://github.com/takluyver/flit。 poetry
和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
如果您 运行 pipenv install -e .
在一个没有 setup.py 的包裹中,那么您将得到:
$ 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 .
将失败 并出现一条神秘的错误消息:
Error parsing requirement . -- are you sure it is installable?
在这种情况下,您应该从 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
所以用处不大。