【问题标题】:Python3: ImportError: No module named '_ctypes' when using Value from module multiprocessingPython3:ImportError:使用模块多处理中的值时没有名为“_ctypes”的模块
【发布时间】:2015-01-17 07:08:30
【问题描述】:

我正在使用 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 中有效吗?
  • 我使用 sudo make install 命令从源代码安装。是的,从多处理导入值在 3.3.2 中工作
  • _ctypes 未构建,因为 libffi-dev 依赖项不可用。考虑改用deadsnakes PPA
  • 安装 libffi-dev 并重新安装 python3.4 解决了我的问题

标签: python compiler-errors installation python-3.4 failed-installation


【解决方案1】:

在我的 Ubuntu 18.04 机器上,我遇到了 python 没有找到 _ctypes 并安装了 pyenv 的常见问题。

在我的情况下,libffi-dev 已经安装。按照 @MikeiLL 的建议,从源代码安装 cpython 也无济于事。

原来是自制问题。

ajkerrigans suggested solution on pyenvs github issues 为我解决了这个问题。

解决方案总结: 告诉 pyenv 使用 Homebrew 管理的 GCC 构建 Python,命令如下:

CC="$(brew --prefix gcc)/bin/gcc-11" \
pyenv install --verbose 3.10.0

这假设任何构建依赖项也已通过 Homebrew 安装,如 pyenv wiki 中指定的那样。在撰写本文时,Linux 上的 Homebrew 看起来像这样:

brew install bzip2 libffi libxml2 libxmlsec1 openssl readline sqlite xz zlib

【讨论】:

  • 请在您的回答中引用或总结您在此处引用的解决方案。
  • 请在此处引用或总结您所指的答案,以便您的答案更清楚!
  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • 感谢您在此处链接@n14s。由于您帮我在此处链接,因此我已编辑您的答案以包含解决方案摘要。当然,请随意保留/修改/删除任何这些更改。干杯:)。
【解决方案2】:

在我的例子中,是什么导致了各种 Python 安装问题,包括与 _ctypeslibffi 相关的问题是 Homebrew on Linux / Linuxbrew。当brew 不再在$PATH 中时,pyenv 再次感到高兴。

【讨论】:

  • 拯救了我的一天!
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    没有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
      制作 && 制作安装

    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

      制作 && 制作安装

    感谢JohnWSteill

    【讨论】:

      【解决方案5】:

      如何在 /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
      

      【讨论】:

        【解决方案6】:

        如果你正在做某事,这里没人会听你说,因为“你的做法不对,你可以试试这个:

        获取 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,它可能会检测到标头。

        【讨论】:

        • 来自 Github 问题的可耻复制粘贴。
        • 介意分享 github 问题 @MurtazaHaji 的链接吗?上面的代码是直接来自源代码,除了插入的行,所以当然要匹配 github。其余的是我的恶作剧类型的写作,我可以保证你是原创的,不太可能其他人会如何表达同样的事情,所以如果该内容出现在其他地方,它是从这里剪切和粘贴的。好奇那个 github 问题的日期 - 以及他们是否修复了它。
        【解决方案7】:

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

        【讨论】:

        • 链接已损坏。正如您在此处显示的那样,我尝试在 Makefile 中进行修改,但没有成功。 _ctypes 仍未构建。
        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          解决了我在 Debian 上的相同错误:

          sudo apt-get install libffi-dev
          

          然后重新编译

          参考:issue31652

          【讨论】:

            【解决方案10】:

            我的解决方案: 使用 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: No module named '_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。

            【讨论】:

            • 对我来说它失败并出现错误generate posix-vars failed。有什么想法吗?
            【解决方案11】:

            您必须从包管理器中加载缺少的 php3 (Python3) 模块。 如果你有 Ubuntu,我推荐Synaptic Package Manager:

            sudo apt-get install synaptic
            

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

            ./configure
            make install.
            

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

            【讨论】:

              【解决方案12】:

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

              【讨论】:

                【解决方案13】:

                如果您在 Debian/Raspbian/Ubuntu 上使用 pyenv 并收到错误“No module named '_ctypes'”(就像我一样),您需要运行以下命令:

                sudo apt-get install libffi-dev
                pyenv uninstall 3.7.6
                pyenv install 3.7.6
                

                使用您的 python 版本而不是 3.7.6

                【讨论】:

                • 欢迎堆栈溢出。你能提供更多信息吗?参考资料等,看看stackoverflow.com/help/how-to-answer
                • 感谢您的回答,投票最高的有我可能需要的完整列表,但这提醒我通过 pyenv 重新安装,以便真正让事情正常工作。使用 pyenv 比获取源代码并肯定地做所有make 的东西要容易得多。
                • 这在 Ubuntu 上对我有用。简单有效。
                • 您不需要先卸载 Python。只需重新安装它就会重新编译 Python 二进制文件,这就是我们所需要的。
                • 是的,需要重新安装python。
                【解决方案14】:

                没有一个解决方案奏效。你必须重新编译你的python;完全安装所有必需的软件包后。

                按照这个:

                1. 安装所需的包
                2. 运行./configure --enable-optimizations

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

                【讨论】:

                • 实际上答案很好。每个人都提到你需要 libffi-devel 并且它会解决它,问题是你还需要重新编译 python。我也放弃了 libffi。
                【解决方案15】:

                当我尝试在 Ubuntu 18.04 中安装 Python 3.7.3 时遇到此错误:$ pyenv install 3.7.3。 运行$ sudo apt-get update &amp;&amp; sudo apt-get install libffi-dev(建议here)后安装成功。 问题已解决there

                【讨论】:

                  【解决方案16】:

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

                  轻微更新

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

                  • 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 的故事。

                  【讨论】:

                  • 太棒了。现在,你能告诉我你是怎么得到上面的清单的吗?通过反复试验? :-O
                  • 老实说,@Veky 我在网络上搜索了错误“ImportError: No module named '_ctypes'”并四处寻找,可能在它起作用之前尝试了一些东西。将更新答案以澄清我对 APT、Python、make 等的了解不足。
                  • 应该是python3-dev 而不是python-devpython-dev 似乎是 python2
                  • 为什么要克隆一个源代码仓库,然后使用sudo apt-get?那没有任何意义。 sudo apt-get处理已经编译好的代码的下载,那你为什么下载代码然后不使用呢?
                  • @MikeiLL 我意识到所有sudo 语句都在安装先决条件,以便构建您下载的源代码。 ./configuremake 的东西需要安装这些东西。
                  【解决方案17】:

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

                  【讨论】:

                  • 我已经安装了libffi-dev,但我仍然收到这个错误
                  • 如果你使用的是linux,执行ldconfig来加载新的libffi.soapt-get install libffi-dev的主要目的是安装一个名为libffi.so的文件,你可以通过dpkg -L libffi-dev查看它@tushar_ecmc
                  • 请注意,如果你已经编译了你自己的 Python 发行版(例如通过pyenv install),你需要在安装包后重新编译发行版。
                  • 这在 Python 3.9 上对我有用。我有 3.8 并且工作正常,然后我从源代码安装了 3.9,并且 pip 安装要求失败并出现同样的错误。安装建议的包并重新构建 Python 3.9 后,它工作了。
                  • 安装 libffi-dev 并重新安装 python3.8.7 对我有用!谢谢@steve-e
                  【解决方案18】:

                  在 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
                  

                  【讨论】:

                  • 这不再适用于 CentOS。 No package libffi-devel is available
                  • @con 如果你的 CentOS 是旧的(这意味着 CentOS 6 在写作时),我认为 repos 已经消失了?您可以从 vault.centos.org/6.8/os/x86_64/Packages 获取软件包(根据您的版本和平台进行调整)。我从那里得到了 libffi-devel。
                  • 这个链接帮助我解决了同样的问题。 (运行 CentOs7)mirror.centos.org/centos/7/os/x86_64/Packages/…
                  【解决方案19】:

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

                  【讨论】:

                  • 这被标记为低质量,我正在审核队列中查看它。它真的不能作为一个独立的答案。我会建议删除,但也许你可以通过扩展它来改进它?
                  猜你喜欢
                  • 1970-01-01
                  • 2021-01-07
                  • 2020-01-23
                  • 2011-05-18
                  • 2018-01-20
                  • 1970-01-01
                  • 2013-12-15
                  • 2021-09-15
                  相关资源
                  最近更新 更多