python - 是否可以将 pipenv 与 setup.py 一起使用?

标签 python setup.py pipenv pyenv

如标题所述——我可以使用 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 命令支持这些包,并调用它们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 包复制到您的 pyenvsite-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/

相关文章:

python - 具有相关参数的蒙特卡罗积分

Python timedelta 收到意外结果

python - 阅读 setup.py 中的 README

python - 安装没有父目录结构的python存储库

pipenv - 如何修复 "ERROR: Could not find a version that matches install"?

pipenv - 为什么当我更改哈希时 pipenv 不提示?

python - 与字典映射匹配的每行的重复数据帧行

python - 将生成的轮文件复制到目的地

python - Pipenv 始终无法锁定并产生大量错误输出

python - PyQt4 表用于从剪贴板插入表 - tableWidget?