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

时间:2018-10-17 18:24:58

标签: python selenium selenium-webdriver

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

2 个答案:

答案 0 :(得分:3)

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

closeApproachData

例如,在python行下面将自动安装chromedriver并设置环境路径。

pip install webdriver-manager

类似地,您也可以配置其他驱动程序。

离线工作

如果您希望python程序包在不受运行时依赖的情况下工作,则需要将驱动程序与程序包一起打包。然后,您可以使用下面的代码下载并获取下载路径。然后,您可以将驱动程序移至您的资源并以编程方式打包它。

from webdriver_manager.chrome import ChromeDriverManager

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

答案 1 :(得分: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}
)