【问题标题】:Using setuptools, how can I download external data upon installation?使用 setuptools,如何在安装时下载外部数据?
【发布时间】:2016-05-29 18:12:43
【问题描述】:

我想创建一些非常易于使用的 pip 包,用于在 Python 中加载常见的机器学习数据集。 (是的,有些东西已经存在,但我希望它更简单。)

我想要实现的是:

  • 用户运行pip install dataset
  • pip 通过wget http://mydata.com/data.tar.gz 下载数据集。请注意,数据并不存在于 python 包本身中,而是从其他地方下载的。
  • pip 从此文件中提取数据并将其放在安装包的目录中。(这并不理想,但数据集非常小,因此假设在此处存储数据不是什么大问题.)
  • 之后,当用户导入我的模块时,模块会自动从特定位置加载数据。

这个问题是关于项目符号 2 和 3。有没有办法用 setuptools 做到这一点?

【问题讨论】:

    标签: python pip setuptools


    【解决方案1】:

    正如 Kevin 所提到的,Python 包安装应该是完全可重现的,并且任何潜在的外部下载问题都应该推送到运行时。因此,不应使用 setuptools 处理此问题。

    相反,为了避免给用户带来负担,请考虑在加载时以惰性方式下载数据。示例:

    def download_data(url='http://...'):
        # Download; extract data to disk.
        # Raise an exception if the link is bad, or we can't connect, etc.
    
    def load_data():
        if not os.path.exists(DATA_DIR):
            download_data()
        data = read_data_from_disk(DATA_DIR)
        return data
    

    然后我们可以在文档中描述download_data,但大多数用户永远不需要打扰它。这有点类似于imageio 模块中关于在运行时下载必要的解码器的行为,而不是让用户自己管理外部下载。

    【讨论】:

      【解决方案2】:

      Python 包安装声明它永远不应该执行 Python 代码来安装 Python 包。这意味着您可能无法在安装过程中下载内容。

      如果您想下载一些额外的数据,请在安装包后执行,例如,当您导入包时,您可以下载此数据并将其缓存在某处,以免在每次新导入时都下载它。

      【讨论】:

      • 进口时的副作用是邪恶的。最好提供一个明确执行此操作的函数。例如,如果用户没有互联网,或者使用某种邪恶的 MitM 代理,该代理会为您提供“此页面被阻止”的 HTML 文件而不是您期望的数据集,该怎么办?
      【解决方案3】:

      请注意,数据并不驻留在 python 包本身中,而是从其他地方下载的。

      请不要这样做。

      Python 打包的全部意义在于提供一种完全确定的、可重复的和可重用的方法来安装每次都完全相同的东西。您的提案至少存在以下问题:

      • 最终用户可能会在计算机 A 上下载您的软件包,将其粘贴到 U 盘上,然后将其安装到没有互联网的计算机 B 上。
      • 网络上的数据可能会发生变化,这意味着安装完全相同的软件包的两个人会得到不同的结果。
      • 提供数据的网站可能不复存在或unwisely change the URL,这意味着仍然拥有该软件包的人将无法使用它。
      • 用户可能在 Internet 过滤器后面,您可能会得到一个无用的“此页面已被阻止”HTML 文件,而不是您期望的数据集。

      相反,您应该在包中包含您的数据(使用 setup()package_data or data_files 参数),或者在您的 Python 代码中提供一个单独的顶级函数,以便在用户准备好时手动下载数据这样做。

      【讨论】:

      • 假设由于许可问题,无法分发数据。然后我认为您所说的是在运行时出现问题比在安装时出现更好。是的? (没想到这一点。我想我同意。)也许我会做的是在运行时进行惰性自动下载,这可能会优雅地失败。
      • 没有。显式优于隐式。用户不希望导入包做任何事情。提供手动启动下载的功能。
      • 我并不是说它会在导入时发生,在绝大多数情况下,手动下载只不过是不必要的麻烦。
      猜你喜欢
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多