Dro*_*rum 13 python ctypes importerror anaconda jupyter
错误: ImportError:导入 _ctypes 时 DLL 加载失败:找不到指定的模块
Need: How to resolve this error? And launch jupyter notebook and use pip from the specific environment? It works on other environment.
While trying to launch jupyter notebook or using pip in virtual environment. I couldn't launch jupyter in the environment "Myenvproject". It launches on the base environment.
I tried to
conda uninstall pyzmq
In the environment.
And reinstall jupyter in "Myenvproject" Environment but it still doesn't launch. Jupyter doesn't launch
Turns out that when I check for
pip --verison
It then also shows the same error
Can't use pip
Windows 10
Python 3.10.0(Anaconda, virtual environment)
我最近多次注意到这个问题(或非常相似/重复的问题),但没有一个提供明确的路径来一致地遇到问题(环境创建、运行命令以达到此状态)。此外,考虑到这个问题被查看的频率,我们只能得出结论,这是一个相当普遍的问题。
我将发布一些指南来防止用户遇到它,以及一些调查技术,旨在让用户知道一旦遇到它如何摆脱它。
注意事项:
我没能遇到这个- 好吧,除非故意破坏环境
错误是关于_ctypes.pyd,但原理适用于任何其他.pyd ( .dll )
虽然我正在对Win进行调查,但概念也适用于Nix
我正在使用(在回答日期,从旧版本不断升级)Anaconda:
导航器2.4.2
康达23.5.2
Python 3.9.17(基础环境)
[Python.Docs]: ctypes - Python 的外部函数库是一个库(最初由 Thomas Heller 启动,然后很久以前被Python的标准库采用),设计用于交互(主要是调用函数)用其他(较低级别)语言编写的.dll ( .so )。
互联网上有大量的例子,即使在这里,我也将举例说明一些(我的):
[SO]:从 python ctypes 访问 OpenSSL FIPS API 不起作用(@CristiFati 的回答)
[SO]:通过 ctypes 从 Python 调用的 C 函数返回不正确的值(@CristiFati 的答案) - 这是一个常见的陷阱,特别是对于经验不足的人来说
CTypes在底层使用LibFFI([GitHub]:libffi/libffi - 一个可移植的外部函数接口库- 主要用C和ASM编写)。
它由 2 部分组成:
核心:用C编写(使用LibFFI)。位于[GitHub]:pytgon/cpython - (main) cpython/Modules/_ctypes。这实现了所有的魔力,并且它是一个扩展模块([Python.Docs]:使用 C 或 C++ 扩展 Python)。它是一个.dll ( .so ) 文件,在Win上名为_ctypes.pyd(这就是我要引用它的方式),或者在Nix上名为_ctypes*.so(检查[Python.PEPs]: PEP 3149 - ABI 版本标记为 . so 文件以获取更多命名约定详细信息)
Python包装器。位于[GitHub]:pytgon/cpython - (main) cpython/Lib/ctypes。提供对核心的Python友好访问
_ctypes.pyd依赖于LibFFI 的方式因操作系统和Python发行版/版本而异。
在某些操作系统(包括Win)上, LibFFI代码(至少是所需的部分)被复制到Python代码库中并内置到_ctypes.pyd中。尽管一开始比较容易,但这不是一个好的做法,因为如果需要保持引用的软件最新,那么维护就会变得非常困难,而且许可也可能成为问题。因此,自Python 3.8起,他们不再这样做([GitHub]:pytgon/cpython - bpo-45022:将当前的 libffi 版本固定到固定版本以准备即将到来的更新,[GitHub]:pytgon/cpython - bpo-45022:将 libffi 更新为Windows 版本中的 3.4.2)。差异(检查libffi_msvc):
这一变化有一些影响:
构建:构建机器上需要LibFFI代码(API ),并且Python代码需要知道它在哪里(类似于需要libffi-dev(或等效项)的Linux世界)
LibFFI构建在_ctypes.pyd所依赖的独立.dll ( libffi*.dll )中(并且必须在运行时(加载模块时)存在)。在Win上,该.dll由Python安装程序提供
说明不同操作系统上的差异:
Win(检查[SO]:如何构建 libjpeg 9b 的 DLL 版本?(@CristiFati 的答案)(在最后)了解.dll依赖项命令详细信息) - PS控制台:
Run Code Online (Sandbox Code Playgroud)[cfati@CFATI-5510-0:E:\Work\Dev\StackExchange\StackOverflow\q073458524]> sopr.bat ### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ### [prompt]> [prompt]> $_CTss = Get-ChildItem 'c:\Install\pc064\Python\Python' -Filter '_ctypes.pyd' -Recurse [prompt]> foreach ($_CTs in $_CTss) { >> echo $_CTs.FullName >> Start-Process -Wait -FilePath 'c:\Install\pc064\Depends\DependencyWalkerPolitistTexan\Version\depends.exe' -ArgumentList '-c', '-ot:out.txt', $_CTs.FullName >> Get-Content 'out.txt' | Select-String 'FFI.*\.DLL$' >> } C:\Install\pc064\Python\Python\02.07.18\DLLs\_ctypes.pyd C:\Install\pc064\Python\Python\03.04.04\DLLs\_ctypes.pyd C:\Install\pc064\Python\Python\03.05.04\DLLs\_ctypes.pyd C:\Install\pc064\Python\Python\03.06.08\DLLs\_ctypes.pyd C:\Install\pc064\Python\Python\03.07.09\DLLs\_ctypes.pyd C:\Install\pc064\Python\Python\03.08\DLLs\_ctypes.pyd [ 6] c:\install\pc064\python\python\03.08\dlls\LIBFFI-7.DLL C:\Install\pc064\Python\Python\03.09\DLLs\_ctypes.pyd [ 6] c:\install\pc064\python\python\03.09\dlls\LIBFFI-7.DLL C:\Install\pc064\Python\Python\03.10\DLLs\_ctypes.pyd [ 6] c:\install\pc064\python\python\03.10\dlls\LIBFFI-7.DLL C:\Install\pc064\Python\Python\03.11\DLLs\_ctypes.pyd [ 6] c:\install\pc064\python\python\03.11\dlls\LIBFFI-8.DLL
操作系统:
Run Code Online (Sandbox Code Playgroud)[cristian.fati@cfati-16i2019-0:~/Work/Dev/StackExchange/StackOverflow/q073458524]> ~/sopr.sh ### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ### Running OSX [064bit prompt]> [064bit prompt]> uname -a Darwin cfati-16i2019-0 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:22 PDT 2023; root:xnu-8796.121.3~7/RELEASE_X86_64 x86_64 [064bit prompt]> [064bit prompt]> for g in 7 8 9 10 11; do _CTS=$(python3.${g} -c "import ctypes;print(_ctypes.__file__)"); echo ${_CTS}; otool -L ${_CTS} | grep ffi; done /usr/local/cellar/python@3.7/3.7.16/frameworks/python.framework/versions/3.7/lib/python3.7/lib-dynload/_ctypes.cpython-37m-darwin.so /usr/local/cellar/python@3.8/3.8.17_1/frameworks/python.framework/versions/3.8/lib/python3.8/lib-dynload/_ctypes.cpython-38-darwin.so /usr/lib/libffi.dylib (compatibility version 1.0.0, current version 30.0.0) /usr/local/cellar/python@3.9/3.9.17_1/frameworks/python.framework/versions/3.9/lib/python3.9/lib-dynload/_ctypes.cpython-39-darwin.so /usr/lib/libffi.dylib (compatibility version 1.0.0, current version 30.0.0) /usr/local/cellar/python@3.10/3.10.12_1/frameworks/python.framework/versions/3.10/lib/python3.10/lib-dynload/_ctypes.cpython-310-darwin.so /usr/lib/libffi.dylib (compatibility version 1.0.0, current version 30.0.0) /usr/local/cellar/python@3.11/3.11.4_1/frameworks/python.framework/versions/3.11/lib/python3.11/lib-dynload/_ctypes.cpython-311-darwin.so /usr/lib/libffi.dylib (compatibility version 1.0.0, current version 30.0.0)
Linux - Ubuntu:
Run Code Online (Sandbox Code Playgroud)(qaic-env) [cfati@cfati-5510-0:/mnt/e/Work/Dev/StackExchange/StackOverflow/q073458524]> ~/sopr.sh ### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ### [064bit prompt]> [064bit prompt]> uname -a Linux cfati-5510-0 6.2.0-37-generic #38~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Nov 2 18:01:13 UTC 2 x86_64 x86_64 x86_64 GNU/Linux [064bit prompt]> [064bit prompt]> for g in 5 6 7 8 9 10 11 12; do _CTS=$(python3.${g} -c "import _ctypes;print(_ctypes.__file__)"); echo ${_CTS}; ldd ${_CTS} | grep ffi; done /usr/lib/python3.5/lib-dynload/_ctypes.cpython-35m-x86_64-linux-gnu.so libffi.so.7 => /lib/x86_64-linux-gnu/libffi.so.7 (0x00007ff1fb7d1000) /usr/lib/python3.6/lib-dynload/_ctypes.cpython-36m-x86_64-linux-gnu.so libffi.so.7 => /lib/x86_64-linux-gnu/libffi.so.7 (0x00007f0bf4ec5000) /usr/lib/python3.7/lib-dynload/_ctypes.cpython-37m-x86_64-linux-gnu.so libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007fc2a3ae6000) /usr/lib/python3.8/lib-dynload/_ctypes.cpython-38-x86_64-linux-gnu.so libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007f32b6176000) /usr/lib/python3.9/lib-dynload/_ctypes.cpython-39-x86_64-linux-gnu.so libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007f40e590a000) /usr/lib/python3.10/lib-dynload/_ctypes.cpython-310-x86_64-linux-gnu.so libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007f20bcbc7000) /usr/lib/python3.11/lib-dynload/_ctypes.cpython-311-x86_64-linux-gnu.so libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007f01a5555000) /usr/lib/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007f4a95e2d000)
Linux - CentOS( Docker):
Run Code Online (Sandbox Code Playgroud)[root@cfati-5510-0:/work/q073458524]> ~/sopr.sh ### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ### [064bit prompt]> [064bit prompt]> cat /etc/os-release | grep PRODUCT REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7" [064bit prompt]> [064bit prompt]> for g in 2.7 3.6; do _CTS=$(python${g} -c "import _ctypes;print(_ctypes.__file__)"); echo ${_CTS}; ldd ${_CTS} | grep ffi; done /usr/lib64/python2.7/lib-dynload/_ctypes.so libffi.so.6 => /lib64/libffi.so.6 (0x00007f6529d71000) /usr/lib64/python3.6/lib-dynload/_ctypes.cpython-36m-x86_64-linux-gnu.so libffi.so.6 => /lib64/libffi.so.6 (0x00007f1085acc000)
关于Nix ( Linux ) 的几句话,发生了类似的错误。
乌班图:
运行该命令ls /usr/lib/x86_64-linux-gnu/libffi*.so* | xargs dpkg -S将输出 3 个包含感兴趣文件的包:LibFFI 8、LibFFI 7、LibFFI-Dev。
根据Python版本,应安装适当的包(不需要第三个包,但添加它以防万一):
apt install libffi8 libffi7 libffi-dev
CentOS:
遵循相同的步骤(不同的工具)会产生:
yum install libffi libffi-devel
更多详细信息可以在[SO]: No module named '_ctypes'中找到。
当然,Anaconda的Python发行版遵循CPython,但他们更进一步。
Run Code Online (Sandbox Code Playgroud)(base) [cfati@CFATI-5510-0:e:\Work\Dev\StackExchange\StackOverflow\q073458524]> :: ------- Anaconda Prompt ------- (base) [cfati@CFATI-5510-0:e:\Work\Dev\StackExchange\StackOverflow\q073458524]> cd /d f:\Install\pc064\Anaconda\Anaconda\Version (base) [cfati@CFATI-5510-0:f:\Install\pc064\Anaconda\Anaconda\Version]> sopr.bat ### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ### [prompt]> :: Reactivate base to have active environment in prompt [prompt]> conda deactivate & conda activate base (base) [prompt]> :: ------- Anaconda Prompt (still) ------- (base) [prompt]> conda env list # conda environments: # F:\Install\pc032\Intel\OneAPI\Version\intelpython\python3.7 F:\Install\pc032\Intel\OneAPI\Version\intelpython\python3.7\envs\2021.1.1 base * f:\Install\pc064\Anaconda\Anaconda\Version py_pc032_030602_00 f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc032_030602_00 py_pc064_030610_00 f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030610_00 py_pc064_030704_00 f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030704_00 py_pc064_030716_00 f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030716_00 py_pc064_030800_00 f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030800_00 py_pc064_030808_00 f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030808_00 py_pc064_030817_00 f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030817_00 py_pc064_030900_00 f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030900_00 py_pc064_030917_00 f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030917_00 py_pc064_030917_01 f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030917_01 py_pc064_031000_00 f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031000_00 py_pc064_031006_00 f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031006_00 py_pc064_031012_00 f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031012_00 py_pc064_031012_01 f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031012_01 py_pc064_031104_00 f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031104_00 (base) [prompt]> (base) [prompt]> :: Search environments for _ctypes.pyd (base) [prompt]> dir /B /S "envs\*_ctypes.pyd" f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc032_030602_00\DLLs\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030610_00\DLLs\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030610_00\DLLs\instrumented\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030704_00\DLLs\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030704_00\DLLs\instrumented\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030716_00\DLLs\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030800_00\DLLs\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030800_00\DLLs\instrumented\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030808_00\DLLs\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030817_00\DLLs\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030900_00\DLLs\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030917_00\DLLs\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030917_01\DLLs\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031000_00\DLLs\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031006_00\DLLs\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031012_00\DLLs\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031012_01\DLLs\_ctypes.pyd f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031104_00\DLLs\_ctypes.pyd (base) [prompt]> (base) [prompt]> :: Search environments for the FFI dll (base) [prompt]> dir /B /S "envs\*ffi*.dll" f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030800_00\DLLs\libffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030808_00\DLLs\libffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030817_00\DLLs\libffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030817_00\Library\bin\ffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030817_00\Library\bin\ffi-8.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030817_00\Library\bin\ffi.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030900_00\DLLs\libffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030917_00\DLLs\libffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_030917_01\DLLs\libffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031000_00\Library\bin\ffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031000_00\Library\bin\ffi-8.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031000_00\Library\bin\ffi.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031006_00\Library\bin\ffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031006_00\Library\bin\ffi-8.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031006_00\Library\bin\ffi.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031012_00\Library\bin\ffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031012_00\Library\bin\ffi-8.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031012_00\Library\bin\ffi.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031012_01\Library\bin\ffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031012_01\Library\bin\ffi-8.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031012_01\Library\bin\ffi.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031104_00\Library\bin\ffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031104_00\Library\bin\ffi-8.dll f:\Install\pc064\Anaconda\Anaconda\Version\envs\py_pc064_031104_00\Library\bin\ffi.dll
正如所见,有 2 种类型的.dll:
libffi*.dll (与_ctypes.pyd位于同一目录中)
ffi*.dll(位于..\Library\bin相对于_ctypes.pyd)
我凭经验发现了我在这里所说的内容(我没有官方消息来源 - 至少还没有)。
#1. 来自CPython(此外,旧版本没有libffi*.dll ),并由Python包分发。
#2. 来自LibFFI包(从Python中分离出来- 它现在提供更大的粒度、单独的升级……)。有 3 个不同的.dll(ffi.dll、ffi-7.dll、ffi-8.dll),但它们只是副本(不知道为什么它们没有SymLink ed)。这似乎是较新的方法,较新的Python版本更喜欢(我认为从v3.10开始)。值得一提的是v3.8.17似乎包含两种形式1。
扫描包内部,路径匹配(一旦删除前导环境部分):
(base) [prompt]> :: ------- Anaconda Prompt (still) ------- (base) [prompt]> dir /B /S "pkgs\*ffi*.dll" f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\libffi-3.4.2-hd77b12b_4\Library\bin\ffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\libffi-3.4.2-hd77b12b_4\Library\bin\ffi-8.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\libffi-3.4.2-hd77b12b_4\Library\bin\ffi.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\libffi-3.4.2-hd77b12b_6\Library\bin\ffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\libffi-3.4.2-hd77b12b_6\Library\bin\ffi-8.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\libffi-3.4.2-hd77b12b_6\Library\bin\ffi.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\libffi-3.4.4-hd77b12b_0\Library\bin\ffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\libffi-3.4.4-hd77b12b_0\Library\bin\ffi-8.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\libffi-3.4.4-hd77b12b_0\Library\bin\ffi.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\python-3.8.0-hff0d562_2\DLLs\libffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\python-3.8.12-h6244533_0\DLLs\libffi-8.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\python-3.8.13-h6244533_0\DLLs\libffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\python-3.8.17-h1aa4202_0\DLLs\libffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\python-3.8.5-h5fd99cc_1\DLLs\libffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\python-3.8.8-hdbf39b2_5\DLLs\libffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\python-3.9.0-h6244533_2\DLLs\libffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\python-3.9.12-h6244533_0\DLLs\libffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\python-3.9.16-h6244533_2\DLLs\libffi-7.dll f:\Install\pc064\Anaconda\Anaconda\Version\pkgs\python-3.9.17-h1aa4202_0\DLLs\libffi-7.dll
| 归档时间: |
|
| 查看次数: |
22577 次 |
| 最近记录: |