Python 如何使用setuptools将css文件与单个模块flask应用程序打包?
给出一个简单的烧瓶应用程序,其组织如下:Python 如何使用setuptools将css文件与单个模块flask应用程序打包?,python,css,flask,setuptools,Python,Css,Flask,Setuptools,给出一个简单的烧瓶应用程序,其组织如下: 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=['fla
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_目录来路由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
但我希望以下内容能够反映存储库的功能:
/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_数据,但我正在寻找一种解决方案,允许我不制作任何包。将数据文件放入站点packages dir有一个技巧,但它依赖于:
bdist_wheel
的未记录行为,因此请注意此技巧可能会停止使用未来版本的wheel
软件包custom.css
的目标目录更改为/
:
setup(
data_files=[('/', ['custom.css'])],
...
)
为什么这样做有效?这是wheel
的一种未记录行为:通常,当您构建和安装源发行版(例如.tar.gz
或.zip
)时,数据文件被放置到指定的目标目录中,例如数据文件=[('/etc',['hosts')]
将覆盖系统的/etc/hosts
文件(假设您具有root权限)。正如您所看到的,系统损坏可能会变得任意糟糕,因此wheel
通过相对化绝对路径来避免这种情况:在上面的示例中,hosts
将不会写入/etc
,而是写入/path/to/python/site packages/etc
。这就是技巧中使用的内容:应该写入系统根目录(/
)的数据文件将写入站点包
然而,这在任何地方都没有记录,因此将来可能会发生变化。密切关注最终解决方案
另外,请记住,如果您构建的是源dist而不是控制盘(通过python setup.py sdist
),则可以将其安装为将custom.css
写入系统根目录而不是站点包:
$ pip install myapp --no-binary=myapp
另一件事:您可以使用pkg\u资源
而不必解析与flask\u app.py
相关的文件路径,因此您不需要处理路径字符串:
from pkg_resources import Requirement, resource_filename
CSS_PATH = resource_filename(Requirement.parse('myapp'), 'custom.css')
这是一个非常有用的解决方法。我将拭目以待,看看是否有其他选项可以与sdist一起使用,并且在作为答案进行检查之前更加可靠。谢谢