我正在尝试迁移到pipenv。我传统上将setup.py与pip一起使用,并使用pip install -e .将模块作为包安装,这样我就可以在项目中的任何地方实现像from myproject.xyz.abc import myClass这样的东西。
如何在去掉setup.py的同时,用pipenv实现类似的效果?
注意:我使用的是python 2.7。
发布于 2017-11-22 03:24:46
更新:
pipenv install -e . 9.0.0已经被released,这应该允许你像预期的那样使用pipenv。
原始答案:
pipenv install -e是错误的,并且已经被fixed in master (pull request)。它将在感恩节之后的下一个版本中提供。
目前的临时解决方法是:
pipenv shell
pip install -e .在发布之后,您应该能够运行与pip相似的pipenv install -e .。
发布于 2017-12-01 21:43:54
更新: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日:的作者在这里描述了问题: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应该在安装之前安装!
这不是解决问题的干净利落的方法,然而,做好这项工作。
发布于 2019-02-22 02:52:36
在您的例子中,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 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,所以用处不大。
https://stackoverflow.com/questions/47227406
复制相似问题