You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用setuptools打包Flask应用时模板文件未被包含的问题

看起来你的问题出在静态文件和模板没有被正确打包进wheel包里,而且原环境能运行是因为Flask直接从项目根目录加载了这些文件,但安装到新virtualenv后,脚本的位置变了,找不到这些资源了。

问题根源分析

你当前的setup.py配置有两个核心问题:

  1. package_data的键应该是Python包的名称,但你用了static、templates这种文件夹名——它们不是Python包(没有__init__.py),所以setuptools不会识别这些配置。
  2. 你的templates和static是放在项目根目录,不属于任何Python包(你的项目只有单独的finapp.py文件,没有名为finapp的包目录),所以setuptools默认不会把这些文件打包进wheel。

方案一:改成标准Python包结构(推荐)

这是最规范的做法,能彻底避免路径相关的后续问题。

1. 调整项目结构

把文件整理成如下包结构:

your-project/
├── finapp/
│   ├── __init__.py       # 空文件,标记这是一个Python包
│   ├── finapp.py
│   ├── users.py
│   ├── static/
│   │   ├── app.js
│   │   ├── axios.js
│   │   ├── style.css
│   │   └── vue.js
│   └── templates/
│       ├── login.html
│       └── main.html
├── setup.py
└── ...(其他如build、dist等目录)
  • 新建finapp文件夹,把原finapp.py、users.py移进去,添加空的__init__.py。
  • 将static和templates也移入finapp文件夹。

2. 修改setup.py

更新后的配置如下:

from setuptools import setup, find_packages

setup(
    name="finapp",
    version="0.1",
    packages=find_packages(),  # 现在会自动识别finapp包
    install_requires=[
        "Flask==1.0.2",
        "Flask-Login==0.4.1",
        "py-bcrypt==0.4",
    ],
    # 用entry_points替代scripts,更规范,适配包结构
    entry_points={
        'console_scripts': [
            'finapp = finapp.finapp:app.run',  # 假设finapp.py里的app是Flask实例,run是启动方法
        ]
    },
    include_package_data=True,
    package_data={
        'finapp': [  # 键为包名finapp,对应包内的资源文件
            'static/*',
            'templates/*',
        ],
    },
    classifiers=[
        "Private :: Do Not Upload"
    ],
)

3. 调整Flask资源加载路径

在finapp/finapp.py中,利用Flask的包路径自动识别能力:

from flask import Flask, render_template

# __name__指向finapp包,Flask会自动从包内查找templates和static
app = Flask(__name__)

# 如果仍有问题,可显式指定路径(一般不需要)
# import pkg_resources
# app.template_folder = pkg_resources.resource_filename('finapp', 'templates')
# app.static_folder = pkg_resources.resource_filename('finapp', 'static')

方案二:不修改结构,用data_files配置(临时方案)

如果不想调整项目结构,可以用data_files将资源文件安装到指定位置,再手动配置Flask路径。

1. 修改setup.py

添加data_files参数:

from setuptools import setup, find_packages

setup(
    name="finapp",
    version="0.1",
    packages=[],  # 无Python包,所以设为空列表
    install_requires=[
        "Flask==1.0.2",
        "Flask-Login==0.4.1",
        "py-bcrypt==0.4",
    ],
    scripts=['finapp.py', 'users.py'],
    data_files=[
        # 格式:(安装路径, 要打包的文件列表)
        ('templates', ['templates/login.html', 'templates/main.html']),
        ('static', ['static/app.js', 'static/axios.js', 'static/style.css', 'static/vue.js']),
    ],
    classifiers=[
        "Private :: Do Not Upload"
    ],
)

这些文件会被安装到virtualenv根目录下的templates和static文件夹。

2. 调整Flask路径

在finapp.py中手动指定资源路径:

from flask import Flask, render_template
import os

app = Flask(__name__)
# 从脚本所在目录向上定位到安装的资源文件夹
script_dir = os.path.dirname(os.path.abspath(__file__))
app.template_folder = os.path.join(script_dir, '../templates')
app.static_folder = os.path.join(script_dir, '../static')

这种方式不够灵活,不同系统的安装路径可能有差异,仅作为临时解决方案。


为什么原环境能正常运行?

原环境中你是直接在项目根目录运行finapp.py,Flask默认会从当前工作目录加载templates和static资源,所以能正常找到。但安装到新virtualenv后,finapp.py被复制到了bin目录,运行时的工作目录不是项目根目录,因此Flask找不到这些文件夹了。

内容的提问来源于stack exchange,提问作者user1974767

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:45:44