问题描述
标题说明-我可以将setup.py与pipenv和pyenv一起使用来管理我的环境,版本和依赖项吗?
我有一个带有setup.py文件的目录结构形式的python包。
我喜欢将pipenv用作项目环境管理器-我使用pyenv来管理多个python版本。
所以我想做的是:
- 使用pyenv获取项目特定的python版本:
pyenv version 3.8.5
- 使用python setup.py install运行安装文件-说这个包叫做foobar-这会将包安装在〜/ .pyenv / versions / 3.8.5 / lib / python3.8 / foobar中(真实名称是不是foobar-只是在这里用它来说明要点)
- 现在,当我转到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
包复制到您的 pyenv
的 site-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。