Python3:ImportError:使用模块多处理中的值时没有名为“_ctypes”的模块
- 2025-02-10 08:57:00
- admin 原创
- 74
问题描述:
我正在使用 Ubuntu,并安装了 Python 2.7.5 和 3.4.0。在 Python 2.7.5 中,我可以成功分配变量x = Value('i', 2)
,但在 3.4.0 中却不行。我得到:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.4/multiprocessing/context.py", line 132, in Value
from .sharedctypes import Value
File "/usr/local/lib/python3.4/multiprocessing/sharedctypes.py", line 10, in <
module>
import ctypes
File "/usr/local/lib/python3.4/ctypes/__init__.py", line 7, in <module>
from _ctypes import Union, Structure, Array
ImportError: No module named '_ctypes'
我刚刚通过安装 3.4.0 的源更新到 3.3.2。它安装在/usr/local/lib/python3.4中。
我是否正确更新至 Python 3.4?
我注意到 Python 3.4 安装在usr/local/lib中,而 Python 3.3.2 仍安装在usr/lib中,因此它没有被覆盖。
解决方案 1:
安装libffi-dev
并重新安装 python3.7 为我解决了这个问题。
需要干净地构建 py 3.7 libffi-dev
,否则后面的东西会失败
如果使用 RHEL/Fedora:
sudo yum install libffi-devel
或者
sudo dnf install libffi-devel
如果使用 Debian/Ubuntu:
sudo apt-get install libffi-dev
解决方案 2:
如果您使用 pyenv 并在 Debian/Raspbian/Ubuntu 上收到错误“没有名为‘_ctypes’的模块”(就像我一样),您需要运行以下命令:
sudo apt-get install libffi-dev
pyenv uninstall 3.7.6
pyenv install 3.7.6
把你的python版本改为3.7.6
解决方案 3:
在全新的 Debian 映像上,克隆https://github.com/python/cpython并运行:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus
sudo apt-get install libncursesw5-dev libgdbm-dev libc6-dev
sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev
sudo apt-get install libssl-dev openssl
sudo apt-get install libffi-dev
现在执行configure
上面克隆的文件:
./configure
make # alternatively `make -j 4` will utilize 4 threads
sudo make altinstall
我已经安装 3.7 并且可以使用了。
轻微更新
看起来我说过我会用更多的解释来更新这个答案,但两年后我没有什么可补充的。
这篇 SO 文章解释了为什么某些库
python-dev
可能是必要的。这篇 SO 文章解释了为什么人们可以在make命令中使用与参数
altinstall
相反的参数。install
除此之外,我猜选择要么是通读 cpython 代码库来寻找#include
需要满足的指令,但我通常会继续尝试安装包,并继续阅读输出来安装所需的包,直到成功。
这让我想起了工程师、经理和程序员的汽车从山上滚下来的故事。
解决方案 4:
在 CentOS 或任何 redhat linux 机器上安装 Python 3.7 的详细步骤:
从https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz下载 Python
提取新文件夹中的内容
在同一目录中打开终端
逐步运行以下代码:
sudo yum -y install gcc gcc-c++ sudo yum -y install zlib zlib-devel sudo yum -y install libffi-devel ./configure make make install
解决方案 5:
_ctypes
在我的 Ubuntu 18.04 机器上,我遇到了使用 pyenv 安装的 python 后无法找到 python 的常见问题。
在我的情况下libffi-dev
已经安装了。cpython
按照@MikeiLL的建议从源代码安装也没有帮助。
最终发现这是一个自制问题。
ajkerrigans 在 pyenvs github 问题上建议的解决方案为我解决了这个问题。
解决方案摘要:告诉 pyenv 使用 Homebrew 管理的 GCC 构建 Python,命令如下:
CC="$(brew --prefix gcc)/bin/gcc-11" \npyenv install --verbose 3.10.0
这假定所有构建依赖项都已通过 Homebrew 进行安装,如pyenv wiki中所述。截至撰写本文时,Linux 上的 Homebrew 如下所示:
brew install bzip2 libffi libxml2 libxmlsec1 openssl readline sqlite xz zlib
解决方案 6:
我想添加 Centos 安装:
sudo yum -y install gcc gcc-c++
sudo yum -y install zlib zlib-devel
sudo yum -y install libffi-devel
检查python版本:
python3 -V
创建虚拟环境:
virtualenv -p python3 venv
解决方案 7:
这为我解决了Debian上的相同错误:
sudo apt-get install libffi-dev
然后再次编译
参考:issue31652
解决方案 8:
所有解决方案都不起作用。一旦所有必需的软件包都已完全安装,您就必须重新编译 Python。
请按照以下步骤操作:
安装所需的软件包
跑步
./configure --enable-optimizations
https://gist.github.com/jerblack/798718c1910ccdd4ede92481229043be
解决方案 9:
当我尝试使用以下命令在Ubuntu 18.04中安装Python 3.7.3时遇到此错误: 。 运行后安装成功(按照此处的建议)。 问题已在那里解决。$ pyenv install 3.7.3
`$ sudo apt-get update && sudo apt-get install libffi-dev`
解决方案 10:
根据这个答案,只需复制粘贴到终端即可。
首次运行:sudo apt-get -y update
然后:
sudo apt-get -y upgrade
sudo apt-get -y dist-upgrade
sudo apt-get -y install build-essential python-dev python-setuptools python-pip python-smbus
sudo apt-get -y install libncursesw5-dev libgdbm-dev libc6-dev
sudo apt-get -y install zlib1g-dev libsqlite3-dev tk-dev
sudo apt-get -y install libssl-dev openssl
sudo apt-get -y install libffi-dev
PS:您可以一次性将整个块复制粘贴到终端中。
解决方案 11:
就我而言,导致各种 Python 安装问题(包括与_ctypes
Linux /Linuxbrew 上的 Homebrewlibffi
有关的问题)的原因是什么。一旦不再存在,我就会再次高兴。pyenv
`brew`$PATH
解决方案 12:
参考这个帖子或者这个帖子,对于 libffi 的自定义安装,Python3.7 很难找到 libffi 的库位置。另一种方法是CONFIGURE_LDFLAGS
在 Makefile 中设置变量,例如CONFIGURE_LDFLAGS="-L/path/to/libffi-3.2.1/lib64"
。
解决方案 13:
我的解决方案:使用 apt-get 安装 libffi-dev 没有帮助。但这有帮助:从源代码安装 libffi,然后从源代码安装 Python 3.8。
我的配置:Ubuntu 16.04 LTS Python 3.8.2
步步:
从 Visual Studio Code 启动调试器时以及运行时,我收到错误消息“ModuleNotFoundError:没有名为‘_ctypes’的模块” python3 -c "import sklearn; sklearn.show_versions()"
。
从https://github.com/libffi/libffi/releases下载 libffi v3.3
安装 libtool:
sudo apt-get install libtool
的 README.md 文件提到 autoconf 和 automake 也是必需的。它们已经安装在我的系统上。
无需文档即可配置 libffi:
./configure --disable-docs
make check
sudo make install
从https://www.python.org/downloads/下载 python 3.8
./configure
make
make test
make install
之后我的python安装可以找到_ctypes。
解决方案 14:
无需 root 的 CentOS
安装 libffi-3.2(不要使用 libffi-3.3)
wget ftp://sourceware.org/pub/libffi/libffi-3.2.tar.gz
tar -xzf libffi-3.2.tar.gz
cd libffi-3.2/
./configure --prefix=$YOUR_LIBFFI_DIR
make && make install
安装 Python3
./configure --prefix=$YOUR_PATH/python/3.7.10 LDFLAGS=-L${YOUR_LIBFFI_DIR}/lib64 PKG_CONFIG_PATH=${YOUR_LIBFFI_DIR}/lib/pkgconfig --enable-shared
制作&&制作安装
感谢JohnWSteill
解决方案 15:
我遇到了同样的问题。上述解决方案对我都不起作用。关键挑战是我没有 root 访问权限。因此,我首先下载了 libffi 的源代码。然后我使用常用命令对其进行了编译:
./configure --prefix=desired_installation_path_to_libffi
make
然后我使用重新编译了python
./configure --prefix=/home/user123/Softwares/Python/installation3/ LDFLAGS='-L/home/user123/Softwares/library/libffi/installation/lib64'
make
make install
在我的例子中,“home/user123/Softwares/library/libffi/installation/lib64”是 libffi.so 所在的 LIBFFI 安装目录的路径。而 /home/user123/Softwares/Python/installation3/ 是 Python 安装目录的路径。请根据您的情况进行修改。
解决方案 16:
如果您的问题与 VSCODE DEBUGGER 有关,请检查您当前选择的 Python 解释器。我安装了 Python3.10.9 和 Python3.10.6;但是,前者可能缺少一些依赖项,因此我切换到后者(我的操作系统默认解释器),从而解决了该问题。
要在 VSCODE 中更改 Python 解释器:
按住 ctrl+shift+P
搜索
Python:Select Interpreter
并尝试您的操作系统默认版本(运行时获取的版本python3 --version
如果问题仍未解决,请运行
sudo apt-get install libffi-dev
。
解决方案 17:
如果您不介意使用Miniconda,则默认会安装必要的外部库和 _ctypes。它确实占用更多空间,并且可能需要使用较旧版本的 Python(例如,截至撰写本文时为 3.7.6 而不是 3.8.2)。
解决方案 18:
如何在没有 libffi 的情况下从源代码安装 Python /usr/local
?
从 github 下载 libffi 并安装到
/path/to/local
下载python源代码并使用以下配置进行编译:
export PKG_CONFIG_PATH=/path/to/local/lib/pkgconfig
./configure --prefix=/path/to/python \n LDFLAGS='-L/path/to/local/lib -Wl,-R/path/to/local/lib' \n --enable-optimizations
make
make install
解决方案 19:
我正在使用MAC M1,并且遇到了这个错误:
... __boot__.py", line 30, in <module> import ctypes
and something was said about the file libffi.8.dylib
我在Anaconda上下载了这个东西,现在一切正常:
https://anaconda.org/wakari/libffi
我通知你,由于上面的大部分内容要么不适用于MAC,要么已经过时,我的Python使用的是Anaconda 版本 3.10.4
使用 py2app 创建的应用程序文件现在可以工作了!!
解决方案 20:
类似案例:
环境:Windows 11,Python 3.11
问题:使用IDA打开二进制文件,错误:
E:DevToolsiOSReverseIDAIDA7.5IDAProloaders/uimage.py: No module named '_ctypes'
Traceback (most recent call last):
File "E:DevToolsiOSReverseIDAIDA7.5IDAPropythonida_idaapi.py", line 616, in IDAPython_ExecScript
exec(code, g)
File "E:/DevTools/iOSReverse/IDA/IDA7.5/IDAPro/loaders/uimage.py", line 79, in <module>
import ctypes
File "E:DevInstallPython311Libctypes__init__.py", line 8, in <module>
from _ctypes import Union, Structure, Array
ModuleNotFoundError: No module named '_ctypes'
解决方案:添加系统环境变量:
+ `PYTHONPATH`=`E:DevInstallPython311Lib;E:DevInstallPython311DLLs;E:DevInstallPython311 cl;`
+ `PYTHONHOME`=`E:DevInstallPython311`
参考:ImportError:没有名为“_ctypes”的模块
+ > Ctypes 包含在标准库中
+ > _ctypes.pyd 位于 PYTHONHOME/DLLs 中。您应该将该目录包含在 PYTHONPATH 环境变量中
解决方案 21:
这与vscode-jupyter出现的问题相关,并解决了该问题。
要在 VSCode 中使用 Jupyter,您需要libffi-devel
先安装。
因此,如果您正在使用,pyenv
则需要安装libffi-devel
,卸载pyenv
您需要使用的版本,然后重新安装它们:
sudo apt-get install libffi-dev
pyenv uninstall <Python version>
pyenv install <Python version>
解决方案 22:
2024,Centos9
yum groupinstall "Development Tools"
wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz
tar -xf Python-3.12.0.tgz
sudo yum install -y libffi-devel
cd Python-3.12.0
./configure --enable-optimizations
make -j $(nproc)
sudo make altinstall
python3.12 --version
解决方案 23:
您必须从包管理器加载缺少的 php3 (Python3) 模块。如果您使用的是 Ubuntu,我推荐Synaptic Package Manager
:
sudo apt-get install synaptic
你可以在那里简单地搜索缺少的模块。搜索 ctypes 并安装所有包。然后转到你的 Python 目录并执行
./configure
make install.
这应该可以解决你的问题。
解决方案 24:
如果你正在做某件事,但没有人会听你说,因为“你做错了”,但你却必须“以错误的方式”去做,原因太愚蠢了,无法解释,也超出了你的控制能力,你可以试试这个:
获取 libffi 并以通常方式将其安装到您的用户安装区域。
git clone https://github.com/libffi/libffi.git
cd libffi
./configure --prefix=path/to/your/install/root
make
make install
然后返回到你的 Python 3 源代码,在 Python 源目录顶层的 setup.py 中找到这部分代码
ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
if not ffi_inc or ffi_inc[0] == '':
ffi_inc = find_file('ffi.h', [], inc_dirs)
if ffi_inc is not None:
ffi_h = ffi_inc[0] + '/ffi.h'
if not os.path.exists(ffi_h):
ffi_inc = None
print('Header file {} does not exist'.format(ffi_h))
ffi_lib = None
if ffi_inc is not None:
for lib_name in ('ffi', 'ffi_pic'):
if (self.compiler.find_library_file(lib_dirs, lib_name)):
ffi_lib = lib_name
break
ffi_lib="ffi" # --- AND INSERT THIS LINE HERE THAT DOES NOT APPEAR ---
if ffi_inc and ffi_lib:
ext.include_dirs.extend(ffi_inc)
ext.libraries.append(ffi_lib)
self.use_system_libffi = True
并添加我在上面用注释标记的行。为什么这是必要的,为什么没有办法让 configure 在 Linux 平台上尊重“--without-system-ffi”,也许我会在接下来的几个小时内找出为什么它“不受支持”,但从那以后一切都正常了。否则,祝你好运……YMMV。
它的作用:只是覆盖那里的逻辑并导致编译器链接命令添加“-lffi”,这才是它真正需要的。如果您有用户安装的库,只要您的PKG_CONFIG_PATH
包含,它就可能能够很好地检测标题path/to/your/install/root/lib/pkgconfig
。