抱歉,这段时间太长了,这是一个非常复杂的情况。
在我的公司,我们正在使用pipenv (包括Pipfile和Pipfile.lock)来控制不同工程师的笔记本电脑上使用的软件包。这对我们来说甚至比大多数团队更重要,因为我们还使用Zappa来部署AWS Lambda代码,而且它显然直接从部署人员的笔记本上打包了依赖项来部署它们。因此,如果人们的笔记本电脑在依赖性方面没有完全一致,我们可以根据部署人员的不同,在云中得到不同的行为。
我们发现,即使试图完全控制Pipfile和Pipfile.lock的依赖关系,我们也会在不同的膝上型计算机上获得不同的Python包,如pip freeze所示,以及部署代码中的错误。
下面是显示我的笔记本电脑和我老板的笔记本电脑之间的区别的确切过程(我引用的Pipfile代码位于多行,但我将它压缩为一行,因为我在格式化方面遇到了问题):
Pipfile,其中包含用[requires] python_version = "3.6" [packages] flask = "*"之类的通配符指定的包。而且,我们没有Pipfile.lock,我的老板(他是这个项目的第一个程序员)总是运行--skip-lockPipfile,用显式版本替换通配符,并使我们的Python更具体,比如[requires] python_version = "3.6.4" [packages] Flask = "==1.0.2"。为此,我得到了老板的pip freeze输出的副本,并将这些版本复制到了Pipfile中,其中有一个名称匹配的列表(我跳过了任何不匹配的内容,因为我假设它是上游依赖项,我们还没有触及它)。这是我干的。Pipfile.lock来控制上游依赖关系。因此,我的老板第一次在没有--skip-lock的情况下运行--skip-lock创建了一个,并承诺这样做。Pipfile.lock,用pipenv --rm删除了我的环境,用pipenv install重新创建了它pip freeze并比较了输出,但我们仍然有许多不同之处。我想我可以让我的老板删除他的pipenv环境,并根据提交的Pipfile和Pipfile.lock重新安装,但是由于它们是基于他的pip freeze的,所以如果有什么改变的话,我会有点惊讶。
所以我只是想知道:这种行为真的出乎意料吗?我一直认为pipenv、Pipfile和Pipfile.lock的结合可以保证两个人有相同的包,只要每个版本都被==[version]锁定。我们还需要做些什么来得到一个非常精确的匹配吗?
如果这真的出乎意料的话,我唯一能想到的是,也许他在pipenv shell之前就没有运行过pip freeze,但我认为他这么做是因为事情与Pipfiles竞争得很好。
附带注意:我还没有将[dev-packages]在Pipfile中转换为有版本,因为我不知道它能做什么,而且我认为它是不相关的。所以那些仍然像pylint = "*"
附加信息
下面是一些回应评论的补充信息.但首先我注意到了一些有趣的事情:
pip freeze差异)中,没有一个是在Pipfile中。pip freeze输出与Pipfile.lock内容相匹配,但我老板的输出不匹配。我认为这可能解释了差异,但他的pip freeze输出与他自己的pipenv lock创建的Pipfile.lock不匹配,这有点令人惊讶,除非问题是他从pipenv shell之外运行pipenv lock。回应这些评论..。以下是我和我老板的笔记本电脑上pip冻结输出(都来自pipenv shell)之间的差异的第一部分:

以下是我和我老板的笔记本电脑在Pipfile.lock上的一些区别。Pipfile.lock是通过让他运行pipenv lock (在pipenv shell之外--尽管我认为这并不重要)来获得的,然后才刚刚提交。然后,我使用pipenv --rm删除了我的环境,运行了pipenv install,并得到了与他刚刚提交的Pipfile.lock的以下不同之处。他的版本又在左边了。
所有这些都是不同之处--我不明白的一点是,为什么我们在这里的差异要比pip freeze少。我们的Pipfile在我们两个人之间还是一样的。




发布于 2019-05-09 13:16:37
确保您共享完全相同环境的唯一方法是与相同的Pipfile.lock同步,与pipenv sync (可选的pipenv sync --dev)同步。
Pipfile是人类的助手,是Pipfile.lock创建中的一个中间部分,它不能确保依赖项完全相同。
pipenv install在U盖2 pipenv函数下调用:lock和sync。pipenv lock将从您的Pipfile生成一个Pipfile.lock。即使在Pipfile中使用固定版本,如果在不同的时刻生成不同的Pipfile.lock,也可能是因为固定包的依赖项可能不固定(取决于发行者)。然后,pipenv sync安装在Pipfile.lock中找到的确切包。
要从Pipfile.lock中的依赖项直接安装环境,必须使用pipenv --python 3.6 install --ignore-pipfile,否则Pipfile.lock将从Pipfile中重新生成。
要轻松地解决您的问题,请修复一个Pipfile.lock版本(如果您使用版本控制,您可以提交它,当然是这样;),然后两者都使用pipenv sync。
然后保持Pipfile.lock完全相同,只要你工作的小版本,错误修复.并且可以自由地重新生成它,以获得主要版本的最新依赖项。在我的项目中,Pipfile中的几乎所有依赖项都没有固定,当我们启动一个新的主要版本时,我们更新Pipfile.lock以尝试新的依赖版本,测试所有内容,有时如果最近引入的向后不兼容的更改将依赖项绑定到以前的版本,那么我们将Pipfile.lock修复到下一个主要版本。
发布于 2019-05-07 18:39:38
pipenv install从Pipfile安装。上游依赖关系可能不同。
pipenv sync从Pipfile.lock安装。没有什么不同的。
这是我从阅读命令的帮助中得到的理解。
$ pipenv
Usage: pipenv [OPTIONS] COMMAND [ARGS]...
Commands:
# ...
install Installs provided packages and adds them to Pipfile, or (if no
# ...
sync Installs all packages specified in Pipfile.lock.https://stackoverflow.com/questions/55926898
复制相似问题