【问题标题】:Irerate over package_data files and copy them to current working directory遍历 package_data 文件并将它们复制到当前工作目录
【发布时间】:2020-04-30 20:12:43
【问题描述】:

背景

我正在开发一个python包,目录结构大致如下:

mossutils/
  setup.py
  mossutils/
    __init__.py
    init.py
    data/
      style.css
      script.js
      ...

我的包的setup.py 声明console_scripts 并包含package_data 文件:

setup(
  name='mossutils',
  packages=['mossutils'],
  package_data={"mossutils": ["data/*"]},
  entry_points = {
    "console_scripts": ['mu-init = mossutils.init:main']
  },
  ...)

通过pip install 安装包按预期工作:一切都安装在我的Python 的Lib\site-packages 中,包括data 目录和其中的所有文件,脚本mu-init 可以从shell 执行(或者更确切地说,命令提示符,因为我使用的是 Windows)。

目标

脚本mu-init 应该在调用它的当前工作目录中做某种项目脚手架。特别是,它应该将所有package_data 文件(data/style.cssdata/script.js、...)复制到当前目录。

解决方案尝试

使用模块pkgutil,我可以读取文件的内容,例如

import pkgutil
...
data = pkgutil.get_data(__name__, "data/style.css")

问题

  1. 有没有办法让我的init.py 脚本迭代 data 目录的内容,无需硬编码文件名(在init.py)?

  2. 是否可以将data 目录中的文件复制到当前工作目录,不打开源文件,读取内容并写入到目标文件?

【问题讨论】:

  • "可以复制文件吗……无需打开、读取……和写入" 不,因为这是复制文件的唯一方法。但你没有义务自己做。 shutil.copy2(src, dst)可以为你做。
  • @phd 不要shutilcopy 函数将文件路径作为参数?如何获得package_data 文件的路径?
  • pkgutil的最后有一个例子。
  • 这些示例提供了关于如何实现 get_data 的直觉,对于特殊情况。我看不出它与这里有什么关系。
  • 您可能想使用`shutil.copy2. The example shows how to get the path to directory data`来复制数据,以便复制文件。

标签: python pip package resources setuptools


【解决方案1】:

您可以使用pkg_resources库获取目录中的文件列表,该库与setuptools一起分发。

import pkg_resources

pkg_resources.resource_listdir("mossutils", "data")

【讨论】:

    猜你喜欢
    • 2014-02-05
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多