可以在setup,py中使用pipenv吗?

问题描述

标题说明-我可以将setup.py与pipenv和pyenv一起使用来管理我的环境,版本和依赖项吗?

我有一个带有setup.py文件的目录结构形式的python包。

我喜欢将pipenv用作项目环境管理器-我使用pyenv来管理多个python版本。

所以我想做的是:

  1. 使用pyenv获取项目特定的python版本:pyenv version 3.8.5
  2. 使用python setup.py install运行安装文件-说这个包叫做foobar-这会将包安装在〜/ .pyenv / versions / 3.8.5 / lib / python3.8 / foobar中(真实名称是不是foobar-只是在这里用它来说明要点)
  3. 现在,当我转到my_project并运行pipenv install foobar时-我得到以下信息:
pipenv install foobar
Installing foobar…
Error:  An error occurred while installing foobar!
Error text:
ERROR: Could not find a version that satisfies the requirement foobar (from -r /var/folders/2d/f68m9g153v9cywvjn16hs6nc0000gn/T/pipenv-4uv_ikyt-requirements/pipenv-asuqkc7y-requirement.txt (line 1)) (from versions: none)
ERROR: No matching distribution found for foobar (from -r /var/folders/2d/f68m9g153v9cywvjn16hs6nc0000gn/T/pipenv-4uv_ikyt-requirements/pipenv-asuqkc7y-requirement.txt (line 1))

✘ Installation Failed 

茫然。

解决方法

我不使用 pyenv 但原理是一样的:你有一个本地可安装的包(使用 setup.py),而 Pipenv 确实通过它的 install 命令支持这些包,它把它们称为 {{3 }}。

你可以告诉 Pipenv 安装一个可编辑的路径——通常这对处理包时的当前工作目录很有用:

$ pipenv install --dev -e .  
  
$ cat Pipfile  
...  
[dev-packages]  
"e1839a8" = {path = ".",editable = true}
...  

让我们从 foobar 文件夹中取出您的 libraries

libraries$ tree
.
├── foobar
│   └── __init__.py
└── setup.py

使用 pipenv 将其安装到其他虚拟环境:

myapp$ pipenv install -e /path/to/libraries
...
Installing -e /path/to/libraries...
Adding foobar to Pipfile's [packages]...
✔ Installation Succeeded 
myapp$ cat Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
foobar = {editable = true,path = "/path/to/libraries"}

[dev-packages]

[requires]
python_version = "3.9"
myapp$ pipenv shell
(myapp) myapp$ python
>>> import foobar
>>> foobar.add(1,2)
3

请注意,您不需要使用 editable dependencies 安装软件包的步骤。这里的好处是,如果您现在编辑 foobar 代码,它会反映在其他环境中,而无需重复 pipenv install

通过运行将其安装到 lib/python3.8/site-packages(或任何 pyenv 安装包的地方)

python setup.py install

行不通,因为这不是正确的流程。您准备好要分发的 foobar,然后从分发版而不是从 site-packages 安装它,后者已经是已安装的版本(没有安装.py)。您可以通过将整个 foobar 包复制到您的 pyenvsite-packages 文件夹(包括 setup.py)来解决这个问题,然后告诉 pipenv从那里安装它......但这不是正确的流程。

pipenv install -e 的替代方案,如果您想测试您的实际源代码分发,则是实际构建 foobar 的源代码分发,然后从中构建 pipenv install

libraries$ python3.8 setup.py sdist
...
Creating tar archive
...

libraries$ tree
.
...
├── dist
│   ├── foobar-0.1.0-py3.8.egg
│   └── foobar-0.1.0.tar.gz
├── foobar
│   └── __init__.py
├── ...
└── setup.py
(myapp) myapp$ pipenv install /path/to/libraries/dist/foobar-0.1.0.tar.gz
Installing /path/to/libraries/dist/foobar-0.1.0.tar.gz...
(myapp) myapp$ cat Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
foobar = {path = "/path/to/libraries/dist/foobar-0.1.0.tar.gz"}

[dev-packages]

[requires]
python_version = "3.9"

但从 sdist 安装会失去在其他应用上使用 foobar 时快速查看更新的便利性。我不知道你的工作流程是什么,但我更喜欢有一个公共目录 (libraries) 而不是我存储所有本地可编辑的包,然后从那里 pipenv install-ing。