如何在Python中包含和安装setup.py中的本地依赖项?

How to include and install local dependencies in setup.py in Python?

我正在创建一个 setup.py 来分发我的应用程序。 此应用程序有许多可以通过 pip 安装的依赖项,它还有一些不能从 PyPI 安装的自定义依赖项。

所以,我创建了一个 custom_package_0.1.whl,它将包含在发行版中,并且必须在 setup.py 安装来自 install_requires.

设想以下应用程序结构:

my_app/
    win_deps/custom_package_0.1.whl
    my_app/
        __init__.py
        main.py
        setup.py
        setup.cfg

我该怎么做?

有几个选项可供您选择:

  1. 将您的包上传到某个服务器,并提供 URL 和 dependency_links
  2. 您可以将 python 包放入 my_app 包中,并使用 packages 参数 link 它,而不是使用 wheel 文件。
  3. 一个更 hacky 的方法是使用 setuptools api,然后自己安装包。

有可能,但不确定您应该使用哪个版本的 setuptools。 步骤:

在setup.py

setup(
  ...,
  install_requires=['my-package'],
  dependency_links=[
    # location to your egg file
    os.path.join(os.getcwd(), 'deps', 'my_package-1.0.0-py3.5.egg')
  ]
)

重要的是你的位置不应该通过 URL 模式测试并且 egg 文件名应该有结构 <package_name_with_no_hyphens>-<version>-<py_version>.egg

扩展 wiesiu_p 的答案,您可以通过链接到其源目录来安装依赖项,该目录有自己的 setup.py.

假设您有依赖项 my-dependency 的源文件,并且 my-dependency 的根目录有自己的 setup.py。在您的应用程序的 setup.py:

setup(
  ...,
  install_requires=['other-dependency','my-dependency'],
  dependency_links=[
    # location to your my-dependency project directory
    ''.join(['file:\', os.path.join(os.getcwd(), 'path', 'to', 'my-dependency#egg=my-dependency-1.0')])
  ]
)

现在,如果您 运行 python setup.py install 使用应用程序的 setup.py,它将安装 my-dependency

有一种新技术(自版本 19.1 起)称为 Direct references。 假装您的文件托管在本地主机上。

from setuptools import setup

path_to_my_project = "/home/user/projects/my_package"  # Do any sort of fancy resolving of the path here if you need to


setup(# ... other arguments
      install_requires=[f"my_package @ file://localhost/{path_to_my_project}#egg=my_package"]
      )

基于上面@RunOrVeith 的回答,这适用于使用相对路径的本地 wheel 文件。所以它可以在各种主机上用来安装第三方包。适用于 Windows 和 Unix。

setup(# ... other arguments
      install_requires=[
          f"my-lib @ file://localhost/{os.getcwd()}/libs/my_lib-xxx-none-any.whl"
      ]
)