Python3:ImportError:没有名为' _ctypes'的模块使用模块多处理中的值时

时间:2014-11-19 16:49:32

标签: python compiler-errors install python-3.4

我正在使用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 中,所以它不是覆盖。

17 个答案:

答案 0 :(得分:127)

安装libffi-dev并重新安装python3.7为我解决了这个问题。

要干净地构建py 3.7 libffi-dev是必需的,否则以后的东西将会失败

如果使用RHEL / Fedora:

yum install libffi-devel

sudo dnf install libffi-devel

如果使用Debian / Ubuntu:

sudo apt-get install libffi-dev

答案 1 :(得分:97)

在新的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并为我工作。

SLIGHT UPDATE

看起来我说我会用更多的解释更新这个答案,两年后我没有多少补充。

  • this SO post解释了为什么某些类似python-dev的库可能是必要的。
  • this SO post解释了为什么可以在make命令中使用altinstall而不是install参数。

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

让我想起了Engineer, the Manager and the Programmer whose car rolls down a hill的故事。

答案 2 :(得分:48)

如果您使用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 :(得分:16)

在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

答案 4 :(得分:11)

我想添加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:

virtualenv -p python3 venv

答案 5 :(得分:7)

这对我 Debian 解决了相同的错误:

sudo apt-get install libffi-dev

然后再次编译

参考:issue31652

答案 6 :(得分:3)

当我尝试使用下一条命令<pre></pre> Ubuntu 18.04 中安装 Python 3.7.3 时遇到此错误。 运行var text_with_line_breaks = retrieve_some_text_from_php(); var element = document.querySelectorAll('#output'); element.innerHTML = '<pre>' + text_with_line_breaks + '</pre>'; 后安装成功(如建议的here)。 there问题已解决。

答案 7 :(得分:3)

我的解决方案: 使用apt-get安装libffi-dev并没有帮助。 但这有帮助:从源代码安装libffi,然后从源代码安装Python 3.8。

我的配置: Ubuntu 16.04 LTS Python 3.8.2

逐步:

从Visual Studio Code启动调试器并运行python3 -c "import sklearn; sklearn.show_versions()"时,出现错误消息“ ModuleNotFoundError:没有名为'_ctypes'的模块”。

  • https://github.com/libffi/libffi/releases下载libffi v3.3
  • 安装libtool:sudo apt-get install libtool 来自libffi的文件README.md提到autoconf和automake也是必需的。它们已经安装在我的系统上。
  • 配置没有文档的libffi:

./configure --disable-docs

make check

sudo make install

之后,我的python安装程序可以找到_ctypes。

答案 8 :(得分:1)

根据 this 的回答,只需复制粘贴到终端即可。

第一次运行: 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:您可以一次性将整个块复制粘贴到终端中。

答案 9 :(得分:1)

没有root的CentOS

  1. 安装 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

  2. 安装 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

    make && make install

感谢JohnWSteill

答案 10 :(得分:1)

我遇到了同样的问题。以上解决方案均不适用于我。关键的挑战是我没有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安装目录的路径。根据您的情况进行修改。

答案 11 :(得分:1)

请参阅this thread,对于libffi的自定义安装,Python3.7很难找到libffi的库位置。另一种方法是在Makefile中设置CONFIGURE_LDFLAGS变量,例如CONFIGURE_LDFLAGS="-L/path/to/libffi-3.2.1/lib64"

答案 12 :(得分:0)

您必须从程序包管理器中加载缺少的php3(Python3)模块。 如果您有Ubuntu,我建议您使用Synaptic Package Manager

sudo apt-get install synaptic

您可以在那里简单地搜索缺少的模块。搜索ctypes并安装所有软件包。然后转到您的Python目录并执行

./configure
make install.

这应该可以解决您的问题。

答案 13 :(得分:0)

如果您不介意使用Miniconda,则默认情况下会安装必需的外部库和_ctypes。它确实需要更多空间,并且可能需要使用适度较旧的Python版本(例如,撰写本文时为3.7.6而不是3.8.2)。

答案 14 :(得分:0)

如何在 /usr/local 中没有 libffi 的情况下从源代码安装 Python?

  1. 从github下载libffi并安装到/path/to/local
  2. 下载python源代码并使用以下配置编译:
export PKG_CONFIG_PATH=/path/to/local/lib/pkgconfig
./configure --prefix=/path/to/python \
    LDFLAGS='-L/path/to/local/lib -Wl,-R/path/to/local/lib' \
    --enable-optimizations
make
make install

答案 15 :(得分:0)

解决方案均无效。您必须再次重新编译python。完全安装完所有必需的软件包后。

关注此:

  1. 安装必需的软件包
  2. 运行./configure --enable-optimizations

https://gist.github.com/jerblack/798718c1910ccdd4ede92481229043be

答案 16 :(得分:-1)

如果您正在做某事,这里没有人会听到您的声音,因为“您做错了方法”,但是您不得不出于“无法理解”的原因“做错了”,而且超出了您的控制能力,您可以尝试以下方法:

获取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

并添加我在上面用注释标记的行。为什么有必要,为什么没有办法在Linux平台上配置尊重'--without-system-ffi`的功能,也许我会找出为什么在接下来的几个小时内“不支持”的原因,但是一切都有从那以后一直工作。否则,祝你好运... YMMV。

作用:只是覆盖那里的逻辑,并导致编译器链接命令添加“ -lffi”,这是它真正需要的全部。如果您是用户安装的库,则只要您的PKG_CONFIG_PATH包含path/to/your/install/root/lib/pkgconfig,它就可以很好地检测标题。