Python3:使用模块multiprocessing中的Value时出现ImportError:找不到名为'_ctypes'的模块

293

我正在使用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,所以它没有被覆盖。


似乎在“安装3.4.0源代码”的过程中出现了一些问题。这究竟是什么意思?这个命令在3.3.2中工作吗? - mechanical_meat
我使用sudo make install命令从源代码安装了软件。是的,在3.3.2中从multiprocessing导入Value是可行的。 - htc_m8
17
由于缺少libffi-dev依赖,因此无法构建_ctypes。可以考虑使用deadsnakes PPA代替。 - Eryk Sun
19
安装libffi-dev并重新安装python3.4解决了我的问题。 - htc_m8
22个回答

446
安装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

97
我已安装了 libffi-dev,但仍然出现这个错误。 - tushar_ecmc
9
如果您正在使用Linux系统,执行ldconfig命令来加载新的libffi.so库文件。而安装libffi-dev软件包的主要目的是为了安装一个名为libffi.so的文件,您可以通过dpkg -L libffi-dev命令来检查它。@tushar_ecmc - Ben-xue
96
请注意,如果您已经编译了自己的Python发行版(例如通过pyenv install),则需要在安装软件包后重新编译发行版。 - nedned
6
在Python 3.9上对我有效。我之前使用的是3.8版本,一切正常,但是在从源代码安装了3.9版本并尝试使用pip安装依赖时出现了同样的错误。安装建议的软件包并重新构建Python 3.9后,它就可以工作了。 - babis21
1
安装libffi-dev并重新安装python3.8.7对我很有帮助!感谢@steve-e - lgallard
显示剩余8条评论

164

在新的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

我已经成功安装并使用了Python 3.7。

稍作更新

看起来我说过我会在这个答案中提供更多的解释,但两年后我没有什么可以补充的了。

  • 这篇SO文章解释了为什么可能需要某些库,例如python-dev
  • 这篇SO文章解释了为什么在make命令中可能会使用altinstall而不是install参数。

除此之外,我想要的选择就是阅读cpython代码库,查找需要满足的#include指令,但我通常做的是继续尝试安装软件包,并不断读取所需软件包的输出,直到安装成功。

这让我想起了一个有关工程师、经理和程序员汽车滚下山的故事


4
好的,那您能告诉我您如何得到上面的列表吗?是通过试错法吗? :-O - Veky
4
老实说,@Veky,我为了解决错误“ImportError: No module named '_ctypes'”做了一次网络搜索,并且在找到正确方法之前进行了一些尝试。我会更新答案,澄清我对APT、Python、make等的了解,以使得内容更加通俗易懂。 - MikeiLL
1
应该使用python3-dev而不是python-devpython-dev似乎是针对python2的。 - Timo
1
@MikeiLL 我意识到所有的 sudo 语句都是为了安装先决条件,以便构建你下载的源代码。./configuremake 需要这些东西被安装。 - Ryan
可选库的附加依赖项; liblzma-dev uuid-dev libreadline-dev(适用于Debian 9上的Python 3.7) - Oddstr13
显示剩余4条评论

156
如果您使用pyenv并在Debian/Raspbian/Ubuntu上遇到错误"No module named '_ctypes'"(就像我一样)则需要运行以下命令:
sudo apt-get install libffi-dev
pyenv uninstall 3.7.6
pyenv install 3.7.6

请将您的Python版本替换为3.7.6


4
谢谢你的回答,得票最高的回答提供了我可能需要的完整列表,但这让我想起要通过 pyenv 重新安装以使事情真正开始运作。使用 pyenv 比抓取源代码并进行所有 make 操作要简单得多。 - dragon788
2
这个在我的Ubuntu上可行。简单又有效。 - Phil
4
您不需要先卸载Python。只需重新安装即可重新编译Python二进制文件,这就是所需的。 - ruslaniv
1
我尝试了上面的每一个答案,但都没有成功。只有你的答案有效。谢谢。 - Pulkit Pahwa
4
没错,重新安装Python是必要的。 - zs2020
显示剩余3条评论

31

在CentOS或任何Redhat Linux机器上安装Python 3.7的详细步骤:

  1. https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz下载Python。
  2. 将内容提取到新文件夹中。
  3. 在相同的目录中打开终端。
  4. 逐步运行以下代码:
sudo yum -y install gcc gcc-c++ 
sudo yum -y install zlib zlib-devel
sudo yum -y install libffi-devel 
./configure
make
make install

2
这在CentOS上已经不再起作用了。libffi-devel软件包不可用。 - con
@con 如果你的CentOS版本比较老(也就是写作时的CentOS 6),我想仓库可能已经消失了?你可以从vault.centos.org/6.8/os/x86_64/Packages获取软件包(根据你的版本和平台进行调整)。我从那里拿到了libffi-devel。 - RaveTheTadpole
这个链接帮助我解决了同样的问题(在CentOs7上运行)http://mirror.centos.org/centos/7/os/x86_64/Packages/libffi-devel-3.0.13-19.el7.x86_64.rpm - BaldDude

21

我想补充一下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


2
这篇文章被标记为低质量,我正在审核队列中查看它。它作为一个独立的答案确实不起作用。我建议删除它,但也许你可以通过扩展它来改善它? - abcd

19
在我的Ubuntu 18.04机器上,我遇到了使用pyenv安装的python找不到_ctypes的常见问题。
在我的情况下,libffi-dev已经安装。按照@MikeiLL建议的方式从源代码安装cpython也没有帮助。
结果是一个homebrew问题。 ajkerrigans在pyenvs github问题中提出的解决方案对我解决了这个问题。
解决方案摘要:告诉pyenv使用Homebrew管理的GCC构建Python,命令如下:
CC="$(brew --prefix gcc)/bin/gcc-11" \
pyenv install --verbose 3.10.0

假定任何构建依赖项也已根据pyenv wiki中的说明通过Homebrew安装。截止本文撰写时,Linux上Homebrew的情况如下:

brew install bzip2 libffi libxml2 libxmlsec1 openssl readline sqlite xz zlib

请在您的回答中引用或概括您所指的解决方案。 - Ouss
请在此引用或总结您所参考的答案,以使您的答案更清晰! - Ouss
虽然链接提供了答案,但最好在此处包含答案的关键部分,并提供链接作为参考。如果链接页面发生更改,仅链接的答案可能会失效。- 来自审核 - Flair
1
感谢@n14s在这里提供链接。既然你帮我提供了链接,我已经编辑了你的答案,包括解决方案摘要。当然,随意保留/修改/删除其中任何更改。干杯 :)。 - ajk
我也遇到了这个问题,但是强制使用Homebrew GCC对我有用。谢谢。 - AMing
显示剩余2条评论

17

这个方法解决了我在Debian上遇到的同样错误:

sudo apt-get install libffi-dev

然后再编译一次。

参考:issue31652


15

6
实际上,回答很棒。每个人都提到你需要libffi-devel,并且这会解决问题,但问题在于你还需要重新编译Python。我差点放弃libffi。 - Aleksander Fular
链接已失效。请使用https://web.archive.org/web/20230314215703/https://gist.github.com/jerblack/798718c1910ccdd4ede92481229043be替代。 - John Targaryen
你在哪里运行./configure - cryanbhu

13

我在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

提示:您可以一次性将整个代码块复制粘贴到终端中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接