如何打包和分发需要安装驱动程序的依赖项的Python项目?

如何打包和分发需要安装驱动程序的依赖项的Python项目?,python,selenium,selenium-webdriver,Python,Selenium,Selenium Webdriver,我正在创建一个Python包,它需要Selenium作为依赖项。为了让Selenium在本地工作,我需要在使用之前安装一个Chrome/Firefox驱动程序。我想知道是否有一种方法可以在安装pip时将此驱动程序与我的软件包一起安装,以便在安装后立即使用我的软件包,而无需执行驱动程序安装的其他步骤?我们可以在运行时以编程方式使用库和设置驱动程序依赖项 pip install webdriver-manager 例如,下面的python行将自动安装chromedriver并设置环境路径 从web

我正在创建一个Python包,它需要Selenium作为依赖项。为了让Selenium在本地工作,我需要在使用之前安装一个Chrome/Firefox驱动程序。我想知道是否有一种方法可以在安装pip时将此驱动程序与我的软件包一起安装,以便在安装后立即使用我的软件包,而无需执行驱动程序安装的其他步骤?

我们可以在运行时以编程方式使用库和设置驱动程序依赖项

pip install webdriver-manager
例如,下面的python行将自动安装chromedriver并设置环境路径

从webdriver\u manager.chrome导入ChromeDriverManager
webdriver.Chrome(ChromeDriverManager().install())
同样,您也可以配置其他驱动程序

离线工作

如果您想让python包与运行时依赖项一起工作,并且需要将驱动程序与包一起打包。然后您可以使用下面的代码下载并获得下载路径。然后,您可以将驱动程序移动到资源中,并以编程方式对其进行打包

executable\u path=ChromeDriverManager().install()

我认为将驱动程序作为软件包的一部分添加是不明智的,因为最终用户可能会更新浏览器,并且需要新版本的驱动程序,此时您必须对软件包进行更新

话虽如此,我不知道你的软件包是做什么的,但是如果你想在你的软件包中添加一些二进制数据,并且在不需要外部软件包的情况下使用它,你可以尝试下面的方法

PostInstall命令将在安装后运行

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}
)

您可以将其添加到Python包的文档中,但是pip如何知道驱动程序的版本、操作系统和任何其他独立于您的包或Python的依赖项?当您想“安装它”时,将其包含在存储库中并使用git clone难道不容易吗.我刚把它加入我的git回购…谢谢!出于这个原因,我最终决定将驱动程序安装作为安装说明的一部分包含在ReadMe.md文件中。