Python setup.py install 包含指定静态文件(打包时包含静态文件)


Outline

需要对下面的Python项目进行打包,编写好了 setup.py 后,直接Python setup.py install;

因为Python setup.py install 默认只保留 .py 的文件,所以 static 不在安装路径内,但此处需要它。

├── ./mdlib
│   ├── ./mdlib/data_api.py
│   ├── ./mdlib/meta_info.py
│   ├── ./mdlib/shm_cache.py
│   └── ./mdlib/shm_data.py
├── ./README.md
├── ./requirements.txt
├── ./scripts
│   ├── ./scripts/clickhouse_import.py
│   ├── ./scripts/__init__.py
│   ├── ./scripts/README.md
│   └── ./scripts/update_bin.log
├── ./setup.cfg
├── ./setup.py
├── ./static
│   ├── ./static/paths2.csv
│   └── ./static/paths.csv
├── ./tests
│   ├── ./tests/README.md
│   ├── ./tests/test_get_feature.py
│   └── ./tests/test_path_finder.py
└── ./utils
    ├── ./utils/__init__.py
    └── ./utils/slice_utils.py

网上一大堆说修改 setup.py 中 package_data、include_package_data 就可以完成我的需求,跟着修改了一通,不起作用,安装后依然不见 static 的踪影;

还有说 添加个 MANIFEST.in 文件,在里面写上保存规则即可,跟着设置了,还是不起作用。

解决

思来想去就是想不通问题出在哪里;

后来发现只要目录下包含 __init__.py 的目录,在执行 Python setup.py install 后都可以成功加入安装路径内;

在Python项目中,如果一个目录包含 __init__.py 文件,那么它就是一个 package了;

然后便再static目录下加入 __init__.py ,再执行 Python setup.py install,惊喜的发现安装路径内出现 static 目录了;

至此问题得到解决。

(注:static 目录下加入 __init__.py,且项目根目录下加入 MANIFEST.in 文件)

setup.py

from setuptools import find_packages, setup

def read_file(file):
    with open(file, "rt") as f:
        return f.read()

setup(
    name='mdlib',  # 项目名
    description='python投研数据接口',
    keywords=(
        "mdlib"
    ),
    packages=find_packages(exclude=[]),
    author='TongDao Technology',
    author_email='TongDao@forex.com.cn',
    license='Apache License v2',
    url='',
    install_requires=[i for i in read_file("requirements.txt").strip().splitlines() if i != ''],
    zip_safe=False,
)

MANIFEST.in

该文件放在项目根目录下(和setup.py同级),然后执行 Python setup.py install 即可

# 我只用到这一个文件,就指定一个了,其余没用
include static/paths.csv