我了解virtualenv和pip。但是这些与捆包机/纸箱有点不同。
例如:
- pip写入shebang或激活脚本的绝对路径
- pip没有
exec
子命令(bundle exec bar
) - virtualenv将Python解释器复制到本地目录
每个Python开发人员都使用virtualenv / pip吗?还有其他适用于Python的软件包管理工具吗?
pipenv
和shovel
下面提到的是更现代的选择,因为这个问题被问。
我了解virtualenv和pip。但是这些与捆包机/纸箱有点不同。
例如:
exec
子命令(bundle exec bar
)每个Python开发人员都使用virtualenv / pip吗?还有其他适用于Python的软件包管理工具吗?
pipenv
和shovel
下面提到的是更现代的选择,因为这个问题被问。
Answers:
根据我对捆绑程序的了解,不带virtualenv的pip应该对您来说很好。您可以将其视为常规gem命令和捆绑程序之间的某种东西。点子可以做的常见事情:
安装软件包(gem安装)
pip install mypackage
依赖项和批量安装(gemfile)
可能最简单的方法是使用pip的requirements.txt文件。基本上,这只是带有可能的版本限制的必需软件包的简单列表。它可能看起来像:
nose==1.1.2
django<1.3
PIL
稍后,当您要安装这些依赖项时,您将执行以下操作:
$ pip install -r requirements.txt
查看需求文件语法中当前所有软件包的一种简单方法是:
$ pip freeze
您可以在此处了解更多信息。
执行(捆绑程序执行)
安装后通常会直接提供所有带有可执行文件的python软件包(除非您有自定义安装程序,否则这是一个特殊的软件包)。例如:
$ pip install gunicorn
$ gunicorn -h
从缓存安装的软件包gem(捆绑包)
有pip bundle
和pip zip/unzip
。但是我不确定是否有很多人使用它。
ps如果您确实关心环境隔离,那么还可以将virtualenv与pip一起使用(他们是密友,并且可以完美地合作)。默认情况下,pip在系统范围内安装软件包,这可能需要管理员权限。
bundle install --path vendor
在本地安装所有内容,并且bundle exec
足够聪明以解决此问题。无需进行明确的环境更改。
bundle exec
。整个问题bundle exec
在于,它会Gemfile
在运行可执行文件之前按照更改环境。Pip与等效bundle exec
,尽管virtualenv可能如此。
Gemfile
在其根中坐享其成,并且您可以,bundle install
而且您也很好,或者bundle --deployment
,并且只要机器上具有所需版本的ruby,它就可以在服务器上运行且几乎不需要执行其他操作。Python根本没有等效项。工具在那里,文化无处不在。
您可以使用pipenv,它与bundler具有相似的接口。
$ pip install pipenv
Pipenv自动创建virtualenv并从Pipfile
或安装依赖项Pipfile.lock
。
$ pipenv --three # Create virtualenv with Python3
$ pipenv install # Install dependencies from Pipfile
$ pipenv install requests # Install `requests` and update Pipfile
$ pipenv lock # Generate `Pipfile.lock`
$ pipenv shell # Run shell with virtualenv activated
您可以运行带有virtualenv作用域的命令,例如bundle exec
。
$ pipenv run python3 -c "print('hello!')"
有一个克隆pbundler。
当前在pip中的版本只是读取 requirements.txt
您已经拥有文件,但是已经过时了。它也不是完全等同的:它坚持要virtualenv
。我注意到,Bundler仅安装缺少的软件包,并提供给您选择将sudo密码安装到系统目录或重新启动的选项,这似乎不是pbundler的功能。
但是,git上的版本几乎可以完全重写,更接近于Bundler的行为……包括拥有“ Cheesefile”,现在不支持requirements.txt。不幸的是,因为requirements.txt是pythonland中的事实上的标准,并且甚至有正式的BDFL标记的工作来对其进行标准化。当这开始生效时,您可以确定像pbundler这样的东西将成为事实上的标准。唉,没什么相当稳定但据我所知,(但我喜欢被证明是错误的)。
我写了一个-https://github.com/Deepwalker/pundler。在PIP上pundle
,名称已被使用。
它使用requirements(_\w+)?.txt
文件作为所需的依赖关系并创建frozen(_\w+)?.txt
具有冻结版本的文件。
关于(_\w+)?
事情-这是环境。您可以创建requirements_test.txt,然后使用PUNDLEENV=test
Requirements_test.txt在运行时将Requirements.txt与它们一起使用。
关于virtualenv –您不需要一个,它的捣蛋头从打捆机中取出。
截至2020年(并且自2018年以来),Python Poetry是最接近Ruby捆绑器的。它已经有两年多的历史了,但仍然非常活跃,拥有出色的文档。有人可能会抱怨curl-pipe-python
-style是推荐的安装方式,但是还有其他选择,例如macOS上的自制软件。
它在后台使用了virtualenvs(与bundler相比),但是它提供并使用了一个锁定文件,负责处理子依赖项,遵守指定的版本限制,并允许自动更新过时的软件包。您喜欢的shell甚至具有自动补全功能。
通过使用pyproject.toml文件,它还比bundler(更接近gemspec。它还可以与JavaScript和TypeScript的npm和yarn比较)。
Poetrify(一个补充项目)有助于将项目从Requirements.txt转换为pyproject.toml进行诗歌创作。
poetry export -f requirements.txt > requirements.txt
如果您需要将其用于其他工具(或者想返回的情况不太可能),可以通过将锁定文件导出到requirements.txt 。
不,并非所有开发人员都使用virtualenv和/或pip,但是许多开发人员使用/更喜欢这些工具
现在,对于软件包开发工具和不同的环境,这是您真正的问题。为了相同的目的,存在其他任何工具,例如Buildout(http://www.buildout.org/en/latest/),为您管理的每个项目隔离环境Python构建系统。一段时间以来,我一直使用它,但是现在不使用。
在Python中,每个项目的独立环境与Ruby中的相同情况略有不同。在我的情况下,我使用pyenv(https://github.com/yyuu/pyenv),类似于rbenv,但是对于Python。每个项目使用不同版本的python和virtualenvs,在这种隔离的环境中,我可以使用pip或易于安装(如果需要)。