使用 setuptools,如何在安装时下载外部数据?

rd1*_*d11 8 python pip setuptools

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

我想实现的是:

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

这个问题是关于子弹 2 和 3。有没有办法用 setuptools 做到这一点?

rd1*_*d11 5

正如 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
Run Code Online (Sandbox Code Playgroud)

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