如何在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
我该怎么做?
有几个选项可供您选择:
- 将您的包上传到某个服务器,并提供 URL 和
dependency_links
。
- 您可以将 python 包放入
my_app
包中,并使用 packages
参数 link 它,而不是使用 wheel 文件。
- 一个更 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"
]
)
我正在创建一个 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
我该怎么做?
有几个选项可供您选择:
- 将您的包上传到某个服务器,并提供 URL 和
dependency_links
。 - 您可以将 python 包放入
my_app
包中,并使用packages
参数 link 它,而不是使用 wheel 文件。 - 一个更 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"
]
)