Pipfile 和 Pipfile.lock 是如何使用的?
Posted
技术标签:
【中文标题】Pipfile 和 Pipfile.lock 是如何使用的?【英文标题】:How are Pipfile and Pipfile.lock used? 【发布时间】:2018-03-02 00:04:36 【问题描述】:在 Python 打包的上下文中,Pipfile/Pipfile.lock 似乎旨在替代 requirements.txt。但是,关于这些实际工作原理的文档并不多。我在 Python 网站 here 的 PyPi 部分找到了对 pipfile 的不断发展的描述,但它非常混乱,并且没有解释文件不同部分的语义。
关于如何理解这些文件的任何指示?
【问题讨论】:
这是来自 Ruby 世界的Gemfile
和 Gemfile.lock
的直接模拟:.lock
文件具有每个依赖项的特定版本;没有该扩展名的版本只有人类已知的控制版本。话虽如此,要求对仍在发展的事物进行解释,距离定义明确、标准化程度低得多,可能还为时过早。
(同样,Pipfile
和 requirements.txt
之间的区别主要在于前者试图采用 Ruby 世界的特性,即能够为多个环境和条件指定依赖集/options/etc. 在单个文件中)。
它似乎已经部署在 Heroku “Python 入门” repo (github.com/heroku/python-getting-started.git) 中,不管你喜不喜欢,它似乎已经生产化了。
明白了。也就是说——文档对我来说看起来很可靠。我不知道我可以在一个不仅仅是重申它们的答案中写什么。
如果您指的是我在 OP 中创建的链接,那么会省略许多内容,例如,在名为 source 的部分中的某些内容实际上意味着什么。跨度>
【参考方案1】:
如果您对 Ruby 的 Bundler 或 Node 的 Npm 有一定的了解,这些文件背后的概念很简单,并且与其他现有工具类似。 Pipenv
既是包又是虚拟环境管理工具,它使用 Pipfile 和 Pipfile.lock 文件来实现这些目标。
Pipenv 以一种默认的标准方式为您处理虚拟环境(不再需要激活和停用)。下面是一些帮助您入门的基础知识,更多信息请访问pipenv website。
开始
开始使用 pipenv 很容易,在您的项目文件夹类型中...
$ pipenv install
...如果它已经有一个requirements.txt
文件,它将生成一个带有需求和虚拟环境文件夹的Pipfile
文件,否则它将生成一个空的Pipfile
文件。如果您不喜欢已安装的内容或改变主意,只需键入...
$ pipenv uninstall <package>
...你可以走了。要激活 pipenv 已经生成的虚拟环境,请使用...
$ pipenv shell
...您的虚拟环境将被激活。离开环境……
$ exit
...您将回到原来的终端会话。
点文件
Pipfile 文件旨在为您的 Python 应用程序或库指定包对开发和执行的要求。你可以通过简单地使用来安装一个包...
$ pipenv install flask
... 它将被添加为部署和执行的依赖项或使用...
$ pipenv install --dev pytest
... 它将被用作开发时间的依赖项。在这两种情况下,如果您需要更具体地了解包版本,如documentation 中所述,pipenv 使用 pip 使用的相同version specifiers。文件语法非常简单,如下所示。
[[source]] # Here goes your package sources (where you are downloading your packages from).
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"
[packages] # Here goes your package requirements for running the application and its versions (which packages you will use when running the application).
requests = "*"
flask = "*"
pandas = "*"
[dev-packages] # Here goes your package requirements for developing the application and its versions (which packages you will use when developing the application)
pylint = "*"
wheel = "*"
[requires] # Here goes your required Python version.
python_version = "3.6"
Pipfile.lock
Pipfile.lock 旨在根据 Pipfile 中存在的包指定应使用的特定版本,避免自动升级包的风险它们相互依赖并破坏您的项目依赖关系树。
您可以使用...锁定当前安装的软件包
$ pipenv lock
... 并且该工具将根据当前安装的版本查找您的虚拟环境文件夹以自动为您生成锁定文件。文件语法不像 Pipfile 那样明显,所以为了简洁,这里就不展示了。
【讨论】:
我承认,我发现它令人困惑,因为我正在编写一个教程,我必须决定 [package]/[dev-package] 的区别是否重要,或者我应该只是把所有东西都放在[包]中。 (谷歌搜索这就是我进入这个页面的原因。)但是在将开发内容放入 [package] 时同时拥有这两种方式让我感到震惊。我可以理解为什么请求应该在 [package] 中。 已按要求进行了更改,以避免对开发包造成混淆,感谢您的评论,希望现在不那么令人困惑:) 我认为这是一个好主意,如果您想跟踪源代码演变过程中的包版本,因为大多数包的版本都会在Pipfile
上加注星标。如果包升级时出现问题,那么应该可以通过查看包版本历史来修复它,实际上,请求库的创建者之一确实建议这样做here。
@Stephen,实际上是相反的,正如pipenv install documentation 中所述,您可以指定--skip-lock
标志来强制它忽略Pipfile.lock
文件,而不是强制它使用它;)
@danieldeveloper001 我的问题是,假设我在安装 'openpyxl' 的两个月前锁定了 v 环境,其版本仅为 3.0 .1。如果我现在通过pipenv install -ignore-Pipfile
安装 V 环境,那么 openpyxl 版本, 3.0.1 还是 3.0.2 会是什么?【参考方案2】:
正如上面@Charles Duffy 所解释的,它是来自Ruby 世界的Gemfile
和Gemfile.lock
的直接模拟。有关详细信息,请参阅下面的参考。
参考:https://medium.com/never-hop-on-the-bandwagon/gemfile-and-gemfile-lock-in-ruby-65adc918b856
【讨论】:
以上是关于Pipfile 和 Pipfile.lock 是如何使用的?的主要内容,如果未能解决你的问题,请参考以下文章