【发布时间】: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.css、data/script.js、...)复制到当前目录。
解决方案尝试
使用模块pkgutil,我可以读取文件的内容,例如
import pkgutil
...
data = pkgutil.get_data(__name__, "data/style.css")
问题
有没有办法让我的
init.py脚本迭代data目录的内容,无需硬编码文件名(在init.py)?是否可以将
data目录中的文件复制到当前工作目录,不打开源文件,读取内容并写入到目标文件?
【问题讨论】:
-
"可以复制文件吗……无需打开、读取……和写入" 不,因为这是复制文件的唯一方法。但你没有义务自己做。
shutil.copy2(src, dst)可以为你做。 -
@phd 不要
shutil的copy函数将文件路径作为参数?如何获得package_data文件的路径? -
pkgutil的最后有一个例子。 -
这些示例提供了关于如何实现
get_data的直觉,对于特殊情况。我看不出它与这里有什么关系。 -
您可能想使用`shutil.copy2
. The example shows how to get the path to directorydata`来复制数据,以便复制文件。
标签: python pip package resources setuptools