编写 Python pip-able 包:如何访问包中的文件?

Writing Python pip-able package: How to access files in the package?

我正在尝试开发一个基于CEFpython技术的可视化包,所以该函数必须访问一个html文件。所以包的结构基本上是:

viz_tool

--> init.py

--> main.py

--> index.html

并且在main.py文件中,我定义了一个函数:

def view():
    index_filepath = os.path.realpath("index.html")
    print(index_filepath)
    browser = cef.CreateBrowserSync(url='file://' + index_filepath,
                                window_title="viz tool")
    ....

目标是,安装这个包后,我可以做:

from viz_tool import view
view()

当然,目前 "index_filepath" 是我当前的工作目录,因此它无法找到 "index.html" 文件。

我应该如何更改代码才能访问 "index.html" 文件,该文件大概位于安装包的目录中?

非常感谢!如果我需要澄清任何事情,请告诉我

查看 pkg_resources 的文档。
它有一个名为 resource_filename 的方法,您可以使用它来获取任何内部模块的绝对路径。

from pkg_resources import resource_filename
from foo.bar import bazz # say bazz has template folder

pth_to_template = resource_filename(bazz.__name__, "template")

这将 return 到 <path to foo>/foo/bar/bazz/template 的绝对路径。

我强烈建议不要将 html 文件放在根文件夹中,并避免使用任何形式的硬编码路径,包括递归执行 os.path.join 以遍历多个级别。它使以后移动文件变得一团糟。

编辑: 要通过相对路径从同一模块访问资源,您可以这样做

pth = resource_filename(__name__, "templates/something.html")

编辑 2:。 您还必须将 package_data 中的所有非 python 文件添加为 ,以便 setup.py 将它们添加到分发包中。