如何在Python中的setup.py中包含和安装本地依赖项?
我正在创建一个setup.py来分发我的应用程序。 这个应用程序有许多依赖项可以通过pip安装,它还有一些自定义依赖项不能从PyPI安装 因此,我创建了一个如何在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
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的内容