更新: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
如果你在没有 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之前要安装!
这不是解决问题的干净方法,但是,做这项工作。