我有一个具有平面布局的 Python 项目,其中包含一些资源文件。我的
pyproject.toml
有以下条目:
[tool.setuptools]
packages = [
"linton",
"linton.subcommand",
]
[tool.setuptools.package-data]
linton = ["init-pages/**"]
以及以下布局:
linton
├── argparse_util.py
├── init-pages
│ ├── Author.in.txt
│ ├── body.in.md
│ ├── breadcrumb.in.py
│ ├── email.in.py
│ ├── Email.in.txt
│ ├── index.nancy.html
│ ├── lastmodified.in.py
│ ├── markdown-to-html.in.sh
│ ├── menudirectory.in.py
│ ├── pageinsite.in.py
│ ├── path-to-root.in.py
│ ├── Sample page
│ │ ├── body.in.md
│ │ └── index.nancy.html
│ ├── style.css
│ ├── template.in.html
│ └── Title.in.txt
├── __init__.py
├── __main__.py
├── subcommand
│ ├── init.py
│ ├── publish.py
│ └── serve.py
└── warnings_util.py
注意
init-pages
目录:它包含 linton init
命令的资源文件,与许多类似的工具一样,该命令创建一个模板项目(在本例中为网站),并将文件复制到其中( 的内容) init-pages
)。
另请注意,
init-pages
包含一些 .py
文件。
打包该项目工作正常:源文件和资源文件按 pip 的预期包含在内。
令我惊讶的是,当我
pip install
这个项目时,pip编译了.py
目录中的init-pages
文件,尽管这个目录不包含在packages
中,仅被标记为包数据。
我无法找到任何有关 pip 如何决定在安装时对哪些文件进行字节编译的文档。我可以全局关闭它,但我当然不想这样做,而且它对我的用户没有帮助。
我还可以通过在将资源文件复制到用户项目时使
linton init
跳过生成的 __pycache__
目录来解决该问题。但它们的存在似乎是错误的,我想阻止这种情况发生。
最佳选择取决于您的用例,但通常,最强大且可维护的解决方案是重新定位资源文件(选项 5),如果它们不需要是可执行的 Python 代码。原因如下:
为什么要重新定位资源文件? 自动阻止编译:pip 或 Python 不会编译非 .py 文件。 清晰的分离:将资源文件(例如配置、模板、数据)与可执行代码分开,使您的包更易于维护。 跨平台友好:避免不同系统将 .py 文件解释为可执行 Python 代码时出现潜在问题。 简化打包:无需在 MANIFEST.in 或 setup.py 中进行额外配置。