Python3: ImportError: нет модуля с именем '_ctypes' при использовании значения из многопроцессорной обработки модуля

Я использую 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.3.2, установив исходники 3.4.0. Он установлен в /usr/local/lib/python3.4.

Правильно ли я обновился до Python 3.4?

Я заметил, что Python 3.4 установлен в usr / local / lib, а Python 3.3.2 все еще установлен в usr / lib, поэтому он не был перезаписан.


person htc_m8    schedule 19.11.2014    source источник
comment
Похоже, что во время установки исходников 3.4.0 что-то пошло наперекосяк. Что это означает? Эта команда работала в 3.3.2?   -  person mechanical_meat    schedule 19.11.2014
comment
Я установил из исходного кода с помощью команды sudo make install. Да, импорт значения из многопроцессорности работал в 3.3.2   -  person htc_m8    schedule 19.11.2014
comment
_ctypes не был построен, потому что libffi-dev зависимость была недоступна. Вместо этого рассмотрите возможность использования deadsnakes PPA.   -  person Eryk Sun    schedule 19.11.2014
comment
Установка libffi-dev и повторная установка python3.4 устранили проблему для меня.   -  person htc_m8    schedule 20.11.2014


Ответы (17)


Установка libffi-dev и повторная установка python3.7 устранили проблему для меня.

для чистой сборки Py 3.7 требуется libffi-dev, иначе ничего не получится

При использовании RHEL / Fedora:

yum install libffi-devel

or

sudo dnf install libffi-devel

При использовании Debian / Ubuntu:

sudo apt-get install libffi-dev
person dotbit    schedule 31.12.2017
comment
Я установил libffi-dev, но все еще получаю эту ошибку - person tushar_ecmc; 18.06.2019
comment
Если вы используете Linux, выполните ldconfig, чтобы загрузить новый файл libffi.so. Основная цель apt-get install libffi-dev - установить файл с именем libffi.so, который вы можете проверить с помощью dpkg -L libffi-dev @tushar_ecmc - person Ben-xue; 28.03.2020
comment
Обратите внимание: если вы скомпилировали собственный дистрибутив Python (например, через pyenv install), вам нужно будет перекомпилировать дистрибутив после установки пакета. - person nedned; 24.04.2020
comment
Это сработало для меня на Python 3.9. У меня было 3.8, и он работал нормально, затем я установил 3.9 из источника, и требования к установке pip не выполнялись с той же ошибкой. После установки предложенного пакета и повторной сборки Python 3.9 все заработало. - person babis21; 10.12.2020
comment
Установка libffi-dev и повторная установка python3.8.7 помогли мне! Спасибо @ steve-e - person lgallard; 15.02.2021
comment
Мне нужно было запустить ./confugure с флагом --with-system-ffi, чтобы он использовал встроенный libffi. - person Arman Babaei; 01.03.2021
comment
Повторная установка python решила мою проблему. - person user67275; 05.04.2021
comment
Как я могу указать путь к ffi, если он установлен не в месте по умолчанию? - person Minek Po1; 28.06.2021
comment
Спасибо, это также работало в windows bash / ubuntu при установке python3.8 - person Priyesh Patel; 22.07.2021

В новом образе 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 и работает у меня.

НЕБОЛЬШОЕ ОБНОВЛЕНИЕ

Похоже, я сказал, что обновлю этот ответ, добавив еще несколько объяснений, и два года спустя мне нечего добавить.

Помимо этого, я предполагаю, что выбор будет заключаться в том, чтобы либо прочитать кодовую базу cpython в поисках #include директив, которые необходимо выполнить, но то, что я обычно делаю, - это продолжаю пытаться установить пакет и просто продолжаю читать выходные данные, устанавливая необходимые пакеты, пока это удается.

Напоминает мне историю с инженером, менеджером и программистом, чья машина катится с холма.

person MikeiLL    schedule 24.12.2016
comment
Фантастика. А теперь скажите, как вы попали в список выше? Методом проб и ошибок? : -O - person Veky; 20.01.2017
comment
Честно говоря, @Veky. Я поискал в Интернете ошибку, ImportError: Нет модуля с именем '_ctypes' и покопался, вероятно, попробовал кое-что, прежде чем это сработало. Обновим ответ, чтобы прояснить мое скудное понимание APT, Python, make и т. Д. - person MikeiLL; 20.01.2017
comment
Это должно быть python3-dev вместо python-dev. python-dev похоже на python2. - person Timo; 08.09.2018
comment
Зачем вам клонировать репозиторий исходного кода, а затем использовать sudo apt-get? В этом нет никакого смысла. sudo apt-get обрабатывает загрузку уже скомпилированного кода, так почему же вы загружаете код, а затем не используете его? - person Ryan; 03.02.2019
comment
@ Райан, это отличный аргумент. Не помню, как я пришел к такому подходу. Уверен, я где-то его нашел. Оглядываясь назад, я также не вижу фактического использования клонированного репозитория. Можете ли вы подтвердить, что он будет работать без клонирования репо? Если это так, нам, вероятно, следует удалить эту строку или, по крайней мере, просто изменить ее, чтобы она ссылалась на репозиторий github на случай, если кто-то захочет взглянуть на нее. - person MikeiLL; 03.02.2019
comment
@MikeiLL Я понял, что все операторы sudo устанавливают предварительные условия для сборки загруженного вами исходного кода. ./configure и make вещи требуют установки этих вещей. - person Ryan; 10.02.2019
comment
Дополнительные зависимости для дополнительных библиотек; liblzma-dev uuid-dev libreadline-dev (минимум для Python 3.7 в Debian 9) - person Oddstr13; 26.02.2019
comment
после установки libffi-devel у меня все еще не работало. Оказалось, что мне нужно сначала удалить python (поскольку он был установлен до установки libffi-devel), а затем снова переустановить его (python) - с этого момента все \ работало, как ожидалось. - person Mariusz; 07.12.2019
comment
Я собирал python 3.8 для монетного двора из исходного кода и продолжал сталкиваться с этой проблемой. После установки этого списка я восстановил python, и у меня больше не было ошибки ctypes - person 5uperdan; 01.05.2020

Если вы используете pyenv и получаете ошибку «Нет модуля с именем '_ctypes'» (например, я) в Debian / Raspbian / Ubuntu, вам необходимо выполнить следующие команды:

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

Ставьте свою версию python вместо 3.7.6

person Evgeniy    schedule 24.02.2020
comment
Добро пожаловать в переполнение стека. Вы можете предоставить дополнительную информацию? Ссылки и т. Д. И посмотрите stackoverflow.com/help/how-to-answer - person mmoomocow; 24.02.2020
comment
Спасибо за ответ, у тех, кто набрал наибольшее количество голосов, был полный список, который мне, вероятно, был нужен, но это напомнило мне о необходимости переустановки через pyenv, чтобы действительно все заработало. Использовать pyenv намного проще, чем брать исходный код и наверняка делать все make. - person dragon788; 25.02.2020
comment
Это сработало для меня на Ubuntu. Просто и эффективно. - person Phil; 15.04.2020
comment
Спасибо, это было полезно. Полный список предварительных условий для pyenv см. На странице github.com/pyenv/pyenv/. wiki / Common-build-issues # prerequisites - person Paweł Mucha; 22.04.2020
comment
Вам не нужно предварительно удалять Python. Просто установите его заново, чтобы перекомпилировать двоичный файл Python, и это то, что нужно. - person ruslaniv; 27.07.2020
comment
Я пробовал каждый из приведенных выше ответов, но безуспешно. Только твой ответ сработал. Спасибо - person Pulkit Pahwa; 12.10.2020
comment
Ага, необходима переустановка python. - person zs2020; 23.11.2020
comment
Решил это и на CentOS! : +1: - person Mark; 08.05.2021

Подробные инструкции по установке Python 3.7 в CentOS или на любой другой Linux-машине с RedHat:

  1. Загрузите Python с https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
  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
person Alok Deep    schedule 06.08.2018
comment
это больше не работает с CentOS. No package libffi-devel is available - person con; 26.02.2021
comment
@con Если у вас старая CentOS (что означает CentOS 6 на момент написания), я думаю, что репозитории исчезли? Вы можете получить пакеты с vault.centos.org/6.8/os/x86_64/Packages (настройте для вашей версии и платформы). Я получил оттуда libffi-devel. - person RaveTheTadpole; 07.03.2021
comment
Эта ссылка помогла мне решить ту же проблему. (работает CentOs7) mirror.centos.org/centos/7/os/x86_64/Packages/ - person BaldDude; 13.03.2021

Думал, что добавлю установки 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

person S.E Furgeson    schedule 05.10.2017
comment
это было отмечено как низкое качество, и я смотрю на него в очереди на рассмотрение. это действительно не работает как отдельный ответ. Я порекомендую удалить, но, может быть, вы сможете улучшить его, расширив? - person dbliss; 05.10.2017

Я столкнулся с этой ошибкой, когда попытался установить Python 3.7.3 в Ubuntu 18.04 с помощью следующей команды: $ pyenv install 3.7.3. Установка прошла успешно после запуска $ sudo apt-get update && sudo apt-get install libffi-dev (как было предложено здесь). Проблема была решена здесь.

person akpp2808    schedule 06.06.2019

Ни одно из решений не помогло. Вам нужно снова перекомпилировать свой питон; как только все необходимые пакеты будут полностью установлены.

Следовать этому:

  1. Установите необходимые пакеты
  2. Запустите ./configure --enable-optimizations

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

person Arash Mohammadi    schedule 11.11.2019
comment
На самом деле отличный ответ. Все упоминают, что вам нужна libffi-devel и что она решит эту проблему, проблема в том, что вам также нужно перекомпилировать python. Я тоже отказался от libffi. - person Aleksander Fular; 08.01.2020

Это решило ту же ошибку для меня в Debian:

sudo apt-get install libffi-dev

и снова скомпилировать

Ссылка: issue31652

person hassanzadeh.sd    schedule 14.06.2020

См. эту ветку или this thread, для индивидуальной установки libffi Python3.7 трудно найти расположение библиотеки libffi. Альтернативный метод - установить переменную CONFIGURE_LDFLAGS в Makefile, например CONFIGURE_LDFLAGS="-L/path/to/libffi-3.2.1/lib64".

person pengchy    schedule 09.04.2019
comment
Ссылка не работает. Я попытался внести изменения в Makefile, как вы здесь показываете, но это не сработало. _ctypes все еще не строится. - person user5915738; 03.01.2020

Мое решение: установка libffi-dev с помощью apt-get не помогла. Но это помогло: установка libffi из исходного кода, а затем установка Python 3.8 из исходного кода.

Моя конфигурация: Ubuntu 16.04 LTS Python 3.8.2

Шаг за шагом:

Я получил сообщение об ошибке «ModuleNotFoundError: No module named '_ctypes'» при запуске отладчика из Visual Studio Code и при запуске python3 -c "import sklearn; sklearn.show_versions()".

  • загрузите libffi v3.3 со страницы https://github.com/libffi/libffi/releases
  • установить libtool: sudo apt-get install libtool В файле README.md из libffi упоминается, что также необходимы autoconf и automake. Они уже были установлены в моей системе.
  • настроить libffi без документации:

./configure --disable-docs

make check

sudo make install

После этого моя установка Python могла найти _ctypes.

person Rolf Kampffmeyer    schedule 27.05.2020
comment
Для меня это не удается с ошибкой generate posix-vars failed. Любая идея? - person Murtaza Haji; 02.03.2021

У меня была такая же проблема. Ни одно из вышеперечисленных решений не помогло мне. Ключевой проблемой было то, что у меня не было корневого доступа. Итак, сначала я загружаю исходный код 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, в котором находится libffi.so. И / home / user123 / Softwares / Python / installation3 / - это путь к каталогу установки Python. Измените их в соответствии с вашим случаем.

person Bhanuday Sharma    schedule 07.08.2020

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

    сделать && сделать установку

Спасибо за JohnWSteill

person Fisher    schedule 12.03.2021

Основываясь на этом ответе, просто скопируйте и вставьте в терминал.

Первый запуск: 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: Вы можете просто скопировать и вставить весь кусок в терминал за один раз.

person Trake Vital    schedule 29.03.2021

Если вы не против использования Miniconda, необходимые внешние библиотеки и _ctypes установлен по умолчанию. Это занимает больше места и может потребовать использования более старой версии Python (например, 3.7.6 вместо 3.8.2 на момент написания этой статьи).

person Christopher Bottoms    schedule 05.05.2020

Вам необходимо загрузить недостающие модули php3 (Python3) из диспетчера пакетов. Если у вас Ubuntu, я рекомендую Synaptic Package Manager:

sudo apt-get install synaptic

Там вы можете просто искать недостающие модули. найдите ctypes и установите все пакеты. Затем перейдите в свой каталог Python и выполните

./configure
make install.

Это должно решить вашу проблему.

person AnthonyS    schedule 15.05.2020

Как установить Python из исходного кода без libffi в /usr/local?

  1. Загрузите libffi с github и установите на /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
person tigertang    schedule 16.02.2021

Если вы делаете что-то, о чем вас здесь никто не услышит, потому что вы делаете это неправильно, но вы должны делать это неправильно по причинам, слишком глупым для объяснения, а также неподконтрольным вам, вы можете попробовать следующее:

Получите libffi и установите его в пользовательскую область установки обычным способом.

git clone https://github.com/libffi/libffi.git
cd libffi
./configure --prefix=path/to/your/install/root
make
make install

Затем вернитесь к исходному тексту Python 3 и найдите эту часть кода в setup.py на верхнем уровне исходного каталога Python.

        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 уважать '--without-system-ffi` на платформах Linux, возможно, я выясню, почему это не поддерживается, в ближайшие пару часов, но все работало когда-либо поскольку. В противном случае, удачи ... YMMV.

ЧТО ЭТО ДЕЛАЕТ: просто переопределяет существующую логику и заставляет команду компоновки компилятора добавить -lffi, что является всем, что ей действительно нужно. Если у вас установлена ​​библиотека пользователем, она, вероятно, отлично определяет заголовки, если ваш PKG_CONFIG_PATH включает path/to/your/install/root/lib/pkgconfig.

person slowkoni    schedule 27.03.2020
comment
Постыдная копипаста из выпуска Github. - person Murtaza Haji; 02.03.2021
comment
Не могли бы вы поделиться ссылкой на эту проблему с github @MurtazaHaji? Приведенный выше код взят непосредственно из источника, за исключением вставленной строки, поэтому, конечно, он будет соответствовать github. Остальное - это мое наплевательское письмо, которое, я могу вам гарантировать, оригинальное и маловероятно, чтобы кто-то другой сформулировал то же самое, поэтому, если этот контент появляется в другом месте, он был вырезан и вставлен отсюда. Любопытно, когда возникла эта проблема с github, а также исправили ли они ее. - person slowkoni; 15.03.2021