如何阻止 pip 编译 Python 源的资源文件?

问题描述 投票:0回答:1

我有一个具有平面布局的 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__
目录来解决该问题。但它们的存在似乎是错误的,我想阻止这种情况发生。

python pip
1个回答
0
投票

最佳选择取决于您的用例,但通常,最强大且可维护的解决方案是重新定位资源文件(选项 5),如果它们不需要是可执行的 Python 代码。原因如下:

为什么要重新定位资源文件? 自动阻止编译:pip 或 Python 不会编译非 .py 文件。 清晰的分离:将资源文件(例如配置、模板、数据)与可执行代码分开,使您的包更易于维护。 跨平台友好:避免不同系统将 .py 文件解释为可执行 Python 代码时出现潜在问题。 简化打包:无需在 MANIFEST.in 或 setup.py 中进行额外配置。

© www.soinside.com 2019 - 2024. All rights reserved.