Pipfile和Pipfile还好吗?锁使用?

在Python打包的上下文中,Pipfile / Pipfile.lock似乎是用来替换requirements.txt的。然而,并没有太多关于这些如何实际工作的文档。我在Python网站在这里的PyPi部分找到了一个关于pipfile的演变描述,但它非常混乱,并且没有解释文件不同部分的语义。

关于如何理解这些文件,有什么建议吗?

193111 次浏览

这些文件背后的概念很简单,类似于其他已经存在的工具,如果你熟悉Ruby的Bundler或Node的Npm的话。Pipenv是一个包和虚拟环境管理工具,使用Pipfile和Pipfile。锁定文件来实现这些目标。

Pipenv为您处理虚拟环境(不再需要激活和取消激活)。下面是一些基础知识,可以从pipenv网站开始。

开始

开始使用pipenv很简单,在你的项目文件夹类型…

$ pipenv install

... 如果它已经有一个requirements.txt文件,它将生成一个包含需求和虚拟环境文件夹的Pipfile文件,否则,它将生成一个空的Pipfile文件。如果你不喜欢或改变了你的想法,你已经安装,只需输入…

$ pipenv uninstall <package>

... 你可以开始了。要激活pipenv已经生成的虚拟环境,请使用…

$ pipenv shell

... 你的虚拟环境将被激活。离开环境…

$ exit

... 您将回到原来的终端会话。

Pipfile

Pipfile文件用于指定Python应用程序或库的包需求,包括开发和执行。您可以通过简单地使用…

$ pipenv install flask

... 它将作为部署和执行的依赖项添加,或者使用…

$ pipenv install --dev pytest

... 它将在开发时用作依赖项。在这两种情况下,如果你需要更具体的包版本,如文档中所述,pipenv使用与pip使用的相同的版本说明符。该文件的语法非常简单,如下所示。

[[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那样明显,因此为了简洁起见,这里将不显示它。

正如上面@Charles Duffy所解释的,它是Ruby世界中GemfileGemfile.lock的直接模拟。有关详细信息,请参阅下面的参考资料。

参考:https://medium.com/never-hop-on-the-bandwagon/gemfile-and-gemfile-lock-in-ruby-65adc918b856

值得注意的是,截至目前(2022年),pipfilepipfile.lock仅由pipenv使用,这是由同一作者编写的工具。目前没有标准(即鼓舞士气的)提到这些文件。

关于pipenv,还有其他流行的工具(如poetry)试图在不使用pipfiles的情况下解决类似的用例。

与此相关的是,由各种pep支持的pyproject.toml的曙光,如660621,它正在慢慢获得setuptoolsflithatch的支持。

自2022年夏天以来,Python打包教程完全用pyproject.toml取代了基于setup.pysetup.cfg的教程。