如标题所述——我可以使用 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
命令支持这些包,并调用它们editable dependencies .
You can tell Pipenv to install a path as editable — often this is useful for the current working directory when working on packages:
$ pipenv install --dev -e . $ cat Pipfile ... [dev-packages] "e1839a8" = {path = ".", editable = true} ...
让我们从 libraries
文件夹中获取您的 foobar
:
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
请注意,您不需要使用 python setup.py install
or pip install .
安装软件包的步骤.这里的好处是,如果您现在编辑 foobar
代码,它会反射(reflect)在其他环境中,而无需重复 pipenv install
。
通过运行将其安装到 lib/python3.8/site-packages(或任何 pyenv
安装包的地方)
python setup.py install
将不起作用,因为那不是正确的流程。您准备要分发的 foobar
,然后从分发 安装它,而不是从已经安装的版本的 site-packages 安装它没有 setup.py)。您可以通过将整个 foobar
包复制到您的 pyenv
的 site-packages 文件夹(包括 setup.py)来解决这个问题,然后告诉 pipenv
从那里安装它....但这不是正确的流程。
pipenv install -e
的替代方法,如果您想测试您的实际源代码分发,是实际构建您的 foobar
源代码分发,然后 pipenv从那里安装
。
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
更新的便利。我不知道你的工作流程是什么,但我更喜欢有一个公共(public)目录 (libraries
) 而不是我存储所有本地可编辑包的地方,然后 pipenv install
-ing那里。
关于python - 是否可以将 pipenv 与 setup.py 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63589425/