如何将生成的 openapi 客户端安装到 zipapp?

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

所以我使用 openapi-generator 生成了一个 openapi 客户端。

我现在想将它安装到我的 zippapp 中。

不过,我的整体结构肯定有问题。

我有一个

app
文件夹。它包含我的
__main__.py
文件,以及我需要的其他所有内容。

这也是我

pip install
我的依赖项所在。 (不确定这是否是正确的方法,但它适用于其他依赖项,所以......)

所以生成openapi客户端后,我

OUT_ABSOLUTE="<path to generated openapi client>"
APP="${PWD}/app"

sudo chown -R "${USER}" "${OUT_ABSOLUTE}"

pip install -t "${APP}" "${OUT_ABSOLUTE}" --upgrade

这表示它成功了,

Building wheels for collected packages: openapi-client
  Building wheel for openapi-client (pyproject.toml) ... done
  Created wheel for openapi-client: filename=openapi_client-1.0.0-py3-none-any.whl size=1666754 sha256=f7beef08b8727cad41d0b23f4eb18b523d75e05c953b52d8079870ad0fa9e79b
  Stored in directory: /tmp/pip-ephem-wheel-cache-05c68l5b/wheels/15/66/d5/db16f91fb5af2f414682e9db528a1a63d5611d8afcfafdb1df
Successfully built openapi-client
Installing collected packages: urllib3, typing-extensions, six, annotated-types, python-dateutil, pydantic-core, pydantic, openapi-client
Successfully installed annotated-types-0.7.0 openapi-client-1.0.0 pydantic-2.8.2 pydantic-core-2.20.1 python-dateutil-2.9.0.post0 six-1.16.0 typing-extensions-4.12.2 urllib3-2.0.7

之后我编写并运行我的应用程序

python -m zipapp app -o my_app.pyz
chmod +x my_app.pyz

python my_app.pyz

这就是事情不再按照我希望的方式发展的地方。

使用 openapi 客户端后

pip install
,我的
app
文件夹如下所示:

enter image description here

如您所见,

pydantic_core._pydantic_core
包裹已存在。

然而,尝试运行该应用程序会让 python 抱怨

Traceback (most recent call last):
  File "/home/user1291/anaconda3/envs/my_app/lib/python3.10/runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/home/user1291/anaconda3/envs/my_app/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/home/user1291/code/my_app/my_app.pyz/__main__.py", line 5, in <module>
  File "/home/user1291/code/my_app/my_app.pyz/my_app.py", line 5, in <module>
  File "/home/user1291/code/my_app/my_app.pyz/openapi_client/__init__.py", line 20, in <module>
  File "/home/user1291/code/my_app/my_app.pyz/openapi_client/api/__init__.py", line 4, in <module>
  File "/home/user1291/code/my_app/my_app.pyz/openapi_client/api/aa_sequences_api.py", line 15, in <module>
  File "/home/user1291/code/my_app/my_app.pyz/pydantic/__init__.py", line 404, in __getattr__
  File "/home/user1291/anaconda3/envs/my_app/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/home/user1291/code/my_app/my_app.pyz/pydantic/validate_call_decorator.py", line 8, in <module>
  File "/home/user1291/code/my_app/my_app.pyz/pydantic/_internal/_validate_call.py", line 7, in <module>
  File "/home/user1291/code/my_app/my_app.pyz/pydantic_core/__init__.py", line 6, in <module>
ModuleNotFoundError: No module named 'pydantic_core._pydantic_core'

我很欣赏在第 404 行遇到“未找到”错误的讽刺,但我宁愿 python 找到它的东西。

如何让它发挥作用?

python python-3.x pip openapi-generator zipapp
1个回答
0
投票

zipapp 打包有一个警告,您不能(轻松)使用 C 扩展。

pydantic_core._pydantic_core
是一个扩展模块,检查
.__file__
属性,它将是一个
.so
文件,而不是
.py
文件。

文档中提到了复杂性和一些解决方法:

注意事项 如果您的应用程序依赖于包含 C 扩展名的包,则该包无法从 zip 文件运行(这是操作系统限制,因为文件系统中必须存在可执行代码,操作系统加载程序才能加载它)。在这种情况下,您可以从 zip 文件中排除该依赖项,并要求用户安装它,或者将其与您的 zip 文件一起发送,并将代码添加到您的

__main__.py

 中,以将包含解压模块的目录包含在 
sys.path
 中。在这种情况下,您需要确保为您的目标架构提供适当的二进制文件(并可能根据用户的计算机在运行时选择正确的版本添加到
sys.path
)。

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