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

如何在Python中的setup.py中包含和安装本地依赖项?,python,setuptools,setup.py,Python,Setuptools,Setup.py,我正在创建一个setup.py来分发我的应用程序。 这个应用程序有许多依赖项可以通过pip安装,它还有一些自定义依赖项不能从PyPI安装 因此,我创建了一个custom\u包\u 0.1.whl,它将包含在发行版中,并且必须在setup之后作为依赖项安装。py安装install\u所需的所有内容 想象一下以下应用程序结构: my_app/ win_deps/custom_package_0.1.whl my_app/ __init__.py mai

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

因此,我创建了一个
custom\u包\u 0.1.whl
,它将包含在发行版中,并且必须在setup之后作为依赖项安装。py安装
install\u所需的所有内容

想象一下以下应用程序结构:

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

我该怎么做

您可以从以下几个选项中选择:

  • 将您的包上载到某个服务器,并提供带有
    依赖项链接的URL
  • 您可以将python包放在
    my_应用程序
    包中,并将其与
    packages
    参数链接,而不是使用wheel文件
  • 一种更黑客的方法是使用
    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文件名应该具有结构
    -.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')])
      ]
    )
    
    现在,如果您使用应用程序的
    setup.py
    运行
    python setup.py install
    ,它将安装
    my dependency

    ,有一种新技术(自版本19.1起)称为。 假装你的文件托管在localhost上

    从设置工具导入设置
    path_to_my_project=“/home/user/projects/my_package”#如果需要,可以在此处对路径进行任何形式的奇特解析
    设置(#…其他参数)
    安装\u requires=[f“我的\u包@file://localhost/{path_to_my_project}#egg=my_包“]
    )
    
    对于
    2
    ,我应该怎么做?我将“win_deps”移到了“my_app”中并添加了
    packages=(['win_deps'])
    但是运行
    python2 setup.py install
    并不会自动安装“win_deps”目录中的所有
    .whl
    软件包。我在2中的意思是,不是提供
    whl
    软件包,您可以将整个包目录
    custom\u package\u 0.1
    移动到此包目录中。哦,您的意思是只需将
    custom\u package\u 0.1
    源文件移动到
    win\u deps
    ?中即可。问题在于setup.py没有任何可用选项来安装控制盘软件包。我唯一能看到的就是我建议你做的事。其他的方法都是一些比较老套的方法,我不建议你这么做。这是一个糟糕的公认答案。它没有关于解决方案的详细信息。我遇到了一个类似的问题,并找到了一个令人满意的答案。这种广为人知的语言没有以非黑客的方式支持本地依赖关系,这真是太遗憾了……我知道这条评论很老了,但我无法让它发挥作用。我尝试了两个
    文件:\`正如您所拥有的,
    文件://`我认为这是正确的?执行
    pip安装--find links=my_package
    可以工作,但当我将其放入安装程序时就不行了。我希望它有帮助。请注意,如果本地依赖项本身具有本地依赖项,这可能会失败,因为可能会从site-packages调用getcwd()。这对我不起作用:它说
    错误:当我执行
    pip安装-e.
    时,找不到与我的依赖项匹配的发行版。即使我安装了
    python setup.py
    我也会收到一个错误
    错误:找不到适合Requirement.parse的发行版('my-dependency')
    。我正在使用pip 20.3.3。查看我的答案,了解如何使其与较新的pip版本一起工作。如果您尚未安装
    my package
    ,这似乎不起作用,因为在您安装之前没有.egg,对吗?@medley56我认为您不需要使用conda或其他工具安装
    my package
    。setuptools从本地位置读取,我想这不适用于较新的pip版本,请滚动到我的答案,查找适用于pip>=19.1的内容