给出一个简单的烧瓶应用程序,其组织如下:
save()
我想在PyPi上将其打包发布,但在将css文件与应用程序一起打包时遇到问题。
setup.py文件如下所示:
app_repo/
--> flask_app.py
--> custom.css
--> setup.py
--> MANIFEST.in
我还在MANIFEST.in文件中包含custom.css文件。
在flask_app.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']},
)
允许我使用Flask的send_from_directory路由css文件。
从存储库目录开发应用程序并运行flask时,应用程序找到了css文件,一切正常。但是当我使用python setup.py sdist打包应用程序时,css文件没有放在flask_app.py附近,因此找不到。
在unix上,setup.py中的data_files条目导致安装的文件如下:
CSS_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'custom.css')
但我喜欢以下内容,以便它反映存储库功能:
/usr/local/custom.css
/usr/local/lib/python3.6/site-packages/flask_app.py
是否有一种方法可以从入口点安装和运行非包装单文件瓶应用程序,以确保css文件与安装python模块的目录位于同一目录中?
我知道我可以创建一个包,将app和css文件放在包中,然后在setup.py文件中使用package_data,但是我正在寻找一个允许我不做的解决方案任何包裹。
答案 0 :(得分:1)
将数据文件放入网站包dir有一个技巧,但它依赖于:
bdist_wheel
的未记录行为,因此请注意此技巧可能会停止使用wheel
包的未来版本。将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
{1}}。这就是技巧中使用的内容:应该写入系统根目录(/
)的数据文件将写入站点包。
但是,这在任何地方都没有记录,因此将来可能会发生变化。请关注this issue以获得最终解决方案。
此外,请记住,如果您构建源dist而不是轮子(通过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')