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

127

Я использую 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 , поэтому он не был перезаписан.

htc_m8
источник
Похоже, что во время "установки исходников 3.4.0" что-то напуталось. Что именно это значит? Эта команда работала в 3.3.2?
Mechanical_meat
Я установил из исходного кода с помощью команды sudo make install. Да, импорт Value из multiprocessing работал в 3.3.2
htc_m8
8
_ctypesне был построен, потому что libffi-devзависимость была недоступна. Вместо этого рассмотрите возможность использования deadsnakes PPA .
Eryk Sun
11
Установка libffi-dev и повторная установка python3.4 устранили проблему для меня
htc_m8

Ответы:

229

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

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

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

yum install libffi-devel

или

sudo dnf install libffi-devel

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

sudo apt-get install libffi-dev
dotbit
источник
35
Я установил, libffi-devно все еще получаю эту ошибку
tushar_ecmc
2
Если вы используете Linux, выполните ldconfigкоманду , чтобы загрузить новый libffi.so. Основная цель apt-get install libffi-dev- установить файл с именем, libffi.soкоторый вы можете проверить с помощью dpkg -L libffi-dev@tushar_ecmc
Ben-xue
15
Обратите внимание: если вы скомпилировали собственный дистрибутив Python (например, через pyenv install), вам нужно будет перекомпилировать дистрибутив после установки пакета.
nedned
121

В новом образе 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 объясняет, почему можно использовать аргумент altinstallвместо installаргумента в команде make .

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

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

MikeiLL
источник
3
Фантастика. А теперь скажите, как вы попали в список выше? Методом проб и ошибок? : -O
Veky
4
Честно говоря, @Veky. Я поискал в Интернете ошибку «ImportError: Нет модуля с именем '_ctypes'» и покопался, вероятно, попробовал кое-что, прежде чем это сработало. Обновлю ответ, чтобы прояснить мое скудное понимание APT, Python, make и т. Д.
MikeiLL
Это должно быть python3-devвместо python-dev. python-devкажется для python2.
Timo
Зачем вам клонировать репозиторий с исходным кодом, а затем использовать sudo apt-get? В этом нет никакого смысла. sudo apt-getобрабатывает загрузку уже скомпилированного кода, так почему вы загружаете код, а затем не используете его?
Райан
1
@MikeiLL Я понял, что все sudoинструкции устанавливают предварительные условия для сборки загруженного вами исходного кода. ./configureи makeматериал требует те вещи , которые будут установлены.
Райан
30

Если вы используете 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

Евгений
источник
Добро пожаловать в переполнение стека. Вы можете предоставить дополнительную информацию? Ссылки и т. Д. И посмотрите stackoverflow.com/help/how-to-answer
Nodejs-nerd
Спасибо за ответ, у самого высокого проголосовавшего был полный список, который мне, вероятно, был нужен, но это напомнило мне переустановить через pyenv, чтобы действительно заставить все работать. Использовать pyenv намного проще, чем брать исходный код и делать все makeнаверняка.
dragon788
Это сработало для меня на Ubuntu. Просто и эффективно.
Фил
Спасибо, это было полезно. Полный список предварительных условий для pyenv см. На сайте github.com/pyenv/pyenv/wiki/Common-build-problems#prerequisites.
Павел Муха,
Вам не нужно сначала удалять Python. Просто установите его заново, и двоичный файл Python будет перекомпилирован, и это то, что нужно.
RusI
22

Подробные инструкции по установке 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
Алок Дип
источник
14

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

SE Furgeson
источник
2
это было отмечено как низкое качество, и я смотрю на это в очереди на рассмотрение. это действительно не работает как отдельный ответ. Я порекомендую удалить, но, может быть, вы сможете улучшить его, расширив?
dbliss 05
11

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

АКПП
источник
6

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

Следить за этим:

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

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

Араш Мохаммади
источник
2
На самом деле отличный ответ. Все говорят, что вам нужна libffi-devel и что она решит эту проблему, проблема в том, что вам также нужно перекомпилировать python. Я тоже отказался от libffi.
Александр Фулар,
3

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

pengchy
источник
Ссылка не работает. Я попытался внести изменения в Makefile, как вы здесь показываете, но это не сработало. _ctypes все еще не строится.
user5915738
Я добавил еще одну ссылку на тему.
Pengchy
2

Мое решение: установка 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.

Рольф Кампффмайер
источник
2

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

sudo apt-get install libffi-dev

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

Ссылка: issue31652

hassanzadeh.sd
источник
0

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

Кристофер Боттомс
источник
0

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

sudo apt-get install synaptic

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

./configure
make install.

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

Anthonys
источник
0

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

Бханудай Шарма
источник
-1

Если вы делаете что-то, никто здесь вас не послушает, потому что «вы делаете это неправильно», но вы должны делать это «не так» по слишком глупым причинам (например, в моем случае это быстро превращается в фол слова о ком-то из команды DevOps с избыточным весом матери), сначала вам нужно:

Получите 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.

slowkoni
источник