我该如何打包并分发需要驱动安装的Python项目及其依赖?

4

我正在创建一个需要 Selenium 作为依赖的 Python 包。要在本地使用 Selenium,需要先安装 Chrome/Firefox 驱动程序。我想知道是否有一种方法可以在使用 pip 安装我的包时同时安装该驱动程序,以便不需要进行额外的驱动程序安装步骤即可立即使用我的包?


2
你可以将这个添加到Python包的文档中,但是pip如何知道驱动程序的版本、操作系统以及与你的包或Python无关的任何其他依赖项呢? - dreftymac
难道不应该很容易,只需将其包含在您的代码库中,然后在需要“安装它”时使用 git clone 吗? - Anton vBR
我刚刚将它添加到我的git仓库中... - Moshe Slavin
2个回答

4
我们可以使用 https://pypi.org/project/webdriver-manager/ 库并在运行时以编程方式设置驱动程序依赖项。
pip install webdriver-manager

例如,下面的Python代码行将自动安装Chromedriver并设置环境路径。
from webdriver_manager.chrome import ChromeDriverManager

webdriver.Chrome(ChromeDriverManager().install())

同样地,您也可以配置其他驱动程序。

离线工作

如果您想让您的Python包在没有运行时依赖性的情况下工作,并且需要将驱动程序与您的包一起打包。 那么您可以使用以下代码来下载并获取下载路径。 然后,您可以将驱动程序移到您的资源中并以编程方式进行打包。

executable_path=ChromeDriverManager().install()

1
我认为将驱动程序作为软件包的一部分添加是不明智的,因为最终用户可能会更新浏览器,这需要一个新版本的驱动程序,在这种情况下,您必须发布软件包的更新。话虽如此,我不知道您的软件包是做什么的,但如果您想添加一些二进制数据到软件包中,并且在不需要外部软件包的情况下使用它,您可以尝试以下方法。PostInstallCommand将在安装后运行。

setup.py

import pkg_resources
from setuptools import setup
from setuptools.command.install import install


class PostInstallCommand(install):
    def run(self):
        driver = pkg_resources.resource_filename(__name__, 'geckodriver.exe')
        # do whatever you want to do with your driver
        install.run(self)


setup(
   name='mypackage',
   version='1.0',
   packages=['mypackage'],
   package_data = {'mypackage': ['drivers/*']},
   description='Test',
   author='Batman',
   author_email='batman@superheroes.com',
   install_requires=['selenium>=3.14.1'],
   cmdclass={'install': PostInstallCommand}
)

谢谢!最终我决定将驱动程序安装作为设置说明的一部分包含在此ReadMe.md文件中,出于这个原因。 - Jeff Bagley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接