所以我使用 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
文件夹如下所示:
如您所见,
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 找到它的东西。
如何让它发挥作用?
zipapp 打包有一个警告,您不能(轻松)使用 C 扩展。
pydantic_core._pydantic_core
是一个扩展模块,检查.__file__
属性,它将是一个.so
文件,而不是.py
文件。
注意事项 如果您的应用程序依赖于包含 C 扩展名的包,则该包无法从 zip 文件运行(这是操作系统限制,因为文件系统中必须存在可执行代码,操作系统加载程序才能加载它)。在这种情况下,您可以从 zip 文件中排除该依赖项,并要求用户安装它,或者将其与您的 zip 文件一起发送,并将代码添加到您的
__main__.py
中,以将包含解压模块的目录包含在sys.path
中。在这种情况下,您需要确保为您的目标架构提供适当的二进制文件(并可能根据用户的计算机在运行时选择正确的版本添加到sys.path
)。