安装数据文件的完整目录

时间:2017-05-22 14:14:22

标签: python setuptools

我正在尝试使用setup.py和setuptools为我的项目构建一个包。一般搜索建议数据文件应放在我的python包下 例如,project/src/package/data

但我的情况更符合this question

我的项目包括Python控制台应用程序和HTML交互式应用程序。现在(在setup.py之前),我让控制台应用程序使用特殊命令将HTML文件复制到特定目录。我在源代码管理中遵循这个目录结构。

project
|-+ console
|   |-+ package
|       |-- __init__.py, etc.
|-+ viz
    |-+ css
    |-+ js
    |-- index.html

我不确定如何使用setup.py和egg文件复制此行为。

  1. 如何确保viz打包? package_data选项似乎与包相关(暗示viz应放在包下。)

    所以,package_data = {'': ['viz/*']}不是我想要的。

  2. 如何完成提取?
    我应该使用pkg_resources.resource_filenameviz放入缓存中,然后shutil将文件复制到预期位置吗?还有更实用的替代方案吗?

1 个答案:

答案 0 :(得分:0)

我考虑更改整个结构并将viz转换为一个包,同时移动安装它的代码。结果就是这样。

project
|-- setup.py
|-+ top-level-package
    |-- __init__.py
    |-+ console
    |   |-- __init__.py, etc.
    |-+ viz
        |-+ css
        |-+ js
        |-- index.html
        |-- __init__.py

虽然这会有效,但我发现an answer实际上可以用于我原来的目的。 setup.py必须以package_data递归复制文件(并且相对路径与..一起使用)。

def package_files(directory):
    paths = []
    for (path, directories, filenames) in os.walk(directory):
        for filename in filenames:
            paths.append(os.path.join("..", path, filename))
    return paths

extra_files = package_files("viz") # this is relative to the project root

setup(
    ...,
    package_data    = {"mypackage": extra_files}
)

我刚刚将原始consolepackage合并为一个,因此Python包直接位于项目根目录下。这是我的最终结构。

project
|-- setup.py
|-+ package
|   |-- __init__.py, etc.
|   |-+ private
|       |-- ...
|-+ viz
    |-+ css
    |-+ js
    |-- index.html