我正在尝试使用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文件复制此行为。
如何确保viz
打包? package_data
选项似乎与包相关(暗示viz
应放在包下。)
所以,package_data = {'': ['viz/*']}
不是我想要的。
如何完成提取?
我应该使用pkg_resources.resource_filename
将viz
放入缓存中,然后shutil
将文件复制到预期位置吗?还有更实用的替代方案吗?
答案 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}
)
我刚刚将原始console
和package
合并为一个,因此Python包直接位于项目根目录下。这是我的最终结构。
project
|-- setup.py
|-+ package
| |-- __init__.py, etc.
| |-+ private
| |-- ...
|-+ viz
|-+ css
|-+ js
|-- index.html