python - 如何使用 setuptools 将 css 文件打包为单模块 Flask 应用程序?

标签 python css flask setuptools

给定一个简单的 Flask 应用程序,其组织如下:

app_repo/
--> flask_app.py
--> custom.css
--> setup.py
--> MANIFEST.in

我想将其打包以便在 PyPi 上发布,但在将 css 文件与应用程序一起打包时遇到问题。

setup.py 文件如下所示:

from setuptools import setup

setup(
    name='myapp',
    version='1',
    py_modules=['flask_app'],
    data_files=[('', ['custom.css'])],
    entry_points={'console_scripts':
                  ['runapp = flask_app:app.run_server']},    
)

我还将 custom.css 文件包含在 MANIFEST.in 文件中。

在flask_app.py 中我有一行:

CSS_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'custom.css')

它允许我使用 Flask 的 send_from_directory 路由 css 文件。

当从存储库目录开发应用程序并运行 Flask 时,应用程序会找到 css 文件,并且一切正常。但是当我使用 python setup.py sdist 打包应用程序时,CSS 文件没有放置在与 Flask_app.py 相邻的位置,因此找不到。

在 unix 上,setup.py 中的 data_files 条目导致安装的文件如下所示:

/usr/local/custom.css
/usr/local/lib/python3.6/site-packages/flask_app.py

但我想要以下内容,以便它反射(reflect)存储库功能:

/usr/local/lib/python3.6/site-packages/custom.css
/usr/local/lib/python3.6/site-packages/flask_app.py

有没有办法拥有一个非包单文件 Flask 应用程序,可以从入口点安装和运行,以确保 css 文件与安装 python 模块的目录位于同一目录中?

我知道我可以创建一个包,将应用程序和css文件放入包中,然后在setup.py文件中使用package_data,但我正在寻找一个允许我不创建任何包的解决方案.

最佳答案

有一个技巧可以将数据文件放入站点包目录,但它依赖于:

  1. 造轮子(因此源代码分发是不行的)
  2. bdist_wheel 的未记录行为,因此请注意此技巧可能会停止与 wheel 的 future 版本一起使用。包。

更改 custom.css 的目标目录至/ :

setup(
    data_files=[('/', ['custom.css'])],
    ...
)

为什么这有效?这是 wheel 的未记录行为:通常,当您构建并安装源发行版(例如 .tar.gz.zip )时,数据文件将放置到指定的目标目录中,例如 data_files=[('/etc', ['hosts'])]会覆盖系统的 /etc/hosts文件(假设您有 root 权限)。正如您所看到的,系统损坏可能会变得任意严重,因此 wheel通过相对化绝对路径来避免这种情况:在上面的示例中, hosts将不写入/etc ,但是到/path/to/python/site-packages/etc 。这就是技巧中使用的内容:应写入系统根目录( / )的数据文件将被写入站点包。

但是,这没有任何记录,因此将来可能会发生变化。关注this issue以获得最终解决方案。

另外,请记住,如果您构建源代码而不是轮子(通过 python setup.py sdist ),则可以安装它,以便 custom.css写入系统根目录而不是站点包:

$ pip install myapp --no-binary=myapp

另一件事:而不是解析相对于 flask_app.py 的文件路径,您可以使用pkg_resources所以你不需要摆弄路径字符串:

from pkg_resources import Requirement, resource_filename
CSS_PATH = resource_filename(Requirement.parse('myapp'), 'custom.css')

关于python - 如何使用 setuptools 将 css 文件打包为单模块 Flask 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50160009/

相关文章:

python - Pygame根据位置重叠 Sprite (绘制顺序)

Jquery 偏移函数使 Firefox 中的顶部样式为负数

css - 定制的 Bootstrap 不包含更少的文件

javascript - 代码在 jsfiddle 中有效,但在我的网站上无效

python - 测试准确率得分高于GridSearchCV中的最佳得分

python - 将不同大小的 torch 张量设置为相等

python - 在不重复代码的情况下测试 Flask WTForms 验证器

html - 如何在 Jinja2 中用换行符替换字符串

python - 禁用模板缓存 Jinja2

jquery - DataTables (serverSide) 在第一次请求时正常,在搜索或重新排序时请求中失败并显示 "[Object object"]