我知道virtualenv和pip。但这些与bundler/carton有一点不同。
例如:
- pip将绝对路径写入shebang或activate脚本
- pip没有
exec
子命令(bundle exec bar
) - virtualenv将Python解释器复制到本地目录
每个Python开发者都使用virtualenv/pip吗?是否还有其他Python包管理工具?
我知道virtualenv和pip。但这些与bundler/carton有一点不同。
例如:
exec
子命令(bundle exec bar
)每个Python开发者都使用virtualenv/pip吗?是否还有其他Python包管理工具?
据我所了解,关于bundler的内容,没有virtualenv的pip应该可以很好地为您工作。您可以将其视为常规gem命令和bundler之间的某种东西。使用pip可以执行的常见操作:
安装包(gem install)
pip install mypackage
依赖项和批量安装(Gemfile)
可能最简单的方法是使用 pip 的 requirements.txt 文件。基本上它只是一个包含可能的版本约束的必需软件包的纯文本列表。它可能看起来像这样:
nose==1.1.2
django<1.3
PIL
后来当您想要安装这些依赖项时,您将执行以下操作:
$ pip install -r requirements.txt
查看当前所有包的要求(requirements)文件语法的简单方法是执行以下命令:
$ pip freeze
你可以在这里了解更多。
执行(bundler exec)
所有带有可执行文件的Python包通常安装后直接可用(除非你有自定义设置或这是一个特殊的包)。例如:
$ pip install gunicorn
$ gunicorn -h
使用bundler包将gem打包以从缓存中安装
有pip bundle
和pip zip/unzip
。但我不确定是否有很多人使用它们。
p.s. 如果您关心环境隔离,也可以与pip一起使用virtualenv(它们是好朋友并且完美地协作)。默认情况下,pip会在系统范围内安装软件包,这可能需要管理员权限。
bundle install --path vendor
会将所有内容本地安装,而bundle exec
聪明地发现这一点,无需显式更改环境。 - Debilskibundle exec
或不使用。bundle exec
的整个意义在于在运行可执行文件之前按照 Gemfile
更改环境。Pip 没有类似于 bundle exec
的功能,虚拟环境可能有。 - Sean MackeseyGemfile
的文件位于根目录中,你只需执行bundle install
就能运行项目了,或者使用bundle --deployment
来在服务器上运行,只要机器上有所需版本的ruby即可。Python没有类似的东西。工具都有,但文化上的普及度却不够。 - ocodopip install
相当于在使用 rbenv
的情况下使用 gem install
- 它是操作系统/用户级别的软件包。而 bundle
及其 Gemfile
主要用于项目依赖管理。它具有许多优化模块存储、安装、升级工作流程的功能,比普通的 gem 工作流程更加先进。 - x'ES$ 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
你可以像 bundle exec
一样在虚拟环境中运行命令。
$ pipenv run python3 -c "print('hello!')"
poetry export -f requirements.txt > requirements.txt
,以供其他工具使用(或者在不太可能的情况下需要返回 requirements.txt)。现在有一个pbundler的克隆版本。
目前在pip中的版本只是读取你已经拥有的requirements.txt
文件,但是它已经非常过时了。而且它并不完全等同:它坚持要创建一个virtualenv
。我注意到,Bundler只安装缺少的软件包,并给您提供了一些选项,可以输入sudo密码以安装到系统目录或重新启动,这似乎不是pbundler的特性。
然而,git上的版本几乎完全重写,更接近Bundler的行为...包括具有“Cheesefile”,现在不支持requirements.txt。这很不幸,因为requirements.txt是Python领域的事实标准,甚至有官方的BDFL工作来标准化它。当这个标准生效时,你可以确定像pbundler这样的东西将成为事实上的标准。可惜,据我所知,还没有什么稳定的东西(但我会很高兴被证明是错的)。
我写了一个工具 — https://github.com/Deepwalker/pundler 。
在PIP上它的名字是pundle
,因为这个名字已经被占用了。
它使用requirements(_\w+)?.txt
文件来指定你需要的依赖项,并创建带有冻结版本的frozen(_\w+)?.txt
文件。
关于(_\w+)?
这个东西——这是环境。你可以创建requirements_test.txt文件,然后使用PUNDLEENV=test
来在运行时与requirements.txt一起使用这些依赖项。
至于virtualenv——你不需要一个,因为这正是pundle从bundler中首先获取的。
不是所有的开发者都使用virtualenv和/或pip,但许多开发者使用/偏好这些工具。
现在,对于软件包开发工具和不同的环境,这才是您真正关心的问题。存在其他类似Buildout(http://www.buildout.org/en/latest/)的工具,用于隔离每个项目的Python构建系统。我曾经使用过一段时间,但现在不再使用。
在Python中,每个项目的独立环境与Ruby中的相同情况略有不同。在我的情况下,我使用pyenv(https://github.com/yyuu/pyenv),它类似于rbenv,但适用于Python。每个项目有不同版本的Python和虚拟环境,在这些隔离的环境中,我可以使用pip或easy-install(如果需要)。
pipenv
和shovel
是更现代的选择。 - Jim Meyer