Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用setuptools将css文件与单个模块flask应用程序打包?_Python_Css_Flask_Setuptools - Fatal编程技术网

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一起使用,并且在作为答案进行检查之前更加可靠。谢谢