是否可以将 pipelinev 与 setup.py 一起使用?

use*_*468 4 python setup.py pyenv pipenv

正如标题所述——我可以将 setup.py 与 pipelinenv 与 pyenv 一起使用来管理我的环境、版本和依赖项吗?

\n

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

\n

我喜欢使用 Pipenv 作为我的项目环境管理器——我使用 pyenv 来管理我的多个 python 版本。

\n

所以我想做的是:

\n
    \n
  1. 使用 pyenv 获取项目特定的 python 版本:pyenv version 3.8.5
  2. \n
  3. 使用 python setup.py install 运行 setupfile -- 假设这个包名为 foobar -- 这会将包安装在 ~/.pyenv/versions/3.8.5/lib/python3.8/foobar 中(真实名称不是 foobar - - 只是用这里来说明这一点)
  4. \n
  5. 现在,当我转到 my_project 并运行 pipelinenv install foobar 时,我得到以下信息:
  6. \n
\n
pipenv install foobar\nInstalling foobar\xe2\x80\xa6\nError:  An error occurred while installing foobar!\nError text:\nERROR: 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)\nERROR: No matching distribution found for foobar (from -r /var/folders/2d/f68m9g153v9cywvjn16hs6nc0000gn/T/pipenv-4uv_ikyt-requirements/pipenv-asuqkc7y-requirement.txt (line 1))\n\n\xe2\x9c\x98 Installation Failed \n
Run Code Online (Sandbox Code Playgroud)\n

不知所措。

\n

Gin*_*pin 9

我不使用 pyenv 但原理是相同的:你有一个本地可安装的包(使用 setup.py),并且 Pipenv 确实通过其install命令支持这些包,并将它们称为可编辑依赖项

\n
\n

您可以告诉 Pipenv 将路径安装为可编辑的 \xe2\x80\x94 通常这对于处理包时的当前工作目录很有用:

\n
$ pipenv install --dev -e .  \n  \n$ cat Pipfile  \n...  \n[dev-packages]  \n"e1839a8" = {path = ".", editable = true}\n...  \n
Run Code Online (Sandbox Code Playgroud)\n
\n

让我们foobarlibraries文件夹中取出:

\n
libraries$ tree\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foobar\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\n
Run Code Online (Sandbox Code Playgroud)\n

要将其安装到其他虚拟环境pipenv

\n
myapp$ pipenv install -e /path/to/libraries\n...\nInstalling -e /path/to/libraries...\nAdding foobar to Pipfile\'s [packages]...\n\xe2\x9c\x94 Installation Succeeded \n
Run Code Online (Sandbox Code Playgroud)\n
myapp$ cat Pipfile\n[[source]]\nurl = "https://pypi.org/simple"\nverify_ssl = true\nname = "pypi"\n\n[packages]\nfoobar = {editable = true, path = "/path/to/libraries"}\n\n[dev-packages]\n\n[requires]\npython_version = "3.9"\n
Run Code Online (Sandbox Code Playgroud)\n
myapp$ pipenv shell\n(myapp) myapp$ python\n>>> import foobar\n>>> foobar.add(1,2)\n3\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
python setup.py install\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

pipenv install -e如果您想测试实际的源代码发行版,另一种方法是实际构建 的源代码发行版foobar,然后pipenv install从中构建。

\n
libraries$ python3.8 setup.py sdist\n...\nCreating tar archive\n...\n\nlibraries$ tree\n.\n...\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dist\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foobar-0.1.0-py3.8.egg\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 foobar-0.1.0.tar.gz\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foobar\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\n
Run Code Online (Sandbox Code Playgroud)\n
(myapp) myapp$ pipenv install /path/to/libraries/dist/foobar-0.1.0.tar.gz\nInstalling /path/to/libraries/dist/foobar-0.1.0.tar.gz...\n
Run Code Online (Sandbox Code Playgroud)\n
(myapp) myapp$ cat Pipfile\n[[source]]\nurl = "https://pypi.org/simple"\nverify_ssl = true\nname = "pypi"\n\n[packages]\nfoobar = {path = "/path/to/libraries/dist/foobar-0.1.0.tar.gz"}\n\n[dev-packages]\n\n[requires]\npython_version = "3.9"\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n