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 , тому його не перезаписали.


Здається, що під час "встановлення джерела 3.4.0" щось порушилось. Що це означає саме? Чи працювала ця команда в 3.3.2?
mechanical_meat

Я встановив з вихідного коду за допомогою команди sudo make install. Так, імпорт Значення з багатопроцесорної роботи працював у 3.3.2
htc_m8

8
_ctypesне було побудовано, оскільки libffi-devзалежність була недоступною. Поміркуйте замість цього використати глуху зміну.
Ерик Нд

11
Встановлення libffi-dev та перевстановлення python3.4 виправили для мене проблему
htc_m8

Відповіді:


227

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

для чистої побудови py libffi-dev потрібно 3.7 , інакше пізніше матеріал не вдасться

Якщо використовується RHEL / Fedora:

yum install libffi-devel

або

sudo dnf install libffi-devel

Якщо використовується Debian / Ubuntu:

sudo apt-get install libffi-dev

35
Я встановив, libffi-devале я все одно отримую цю помилку
tushar_ecmc

2
Якщо ви використовуєте linux , Execute, ldconfigщоб завантажити новий libffi.so. Основна мета apt-get install libffi-dev- встановити файл під назвою, libffi.soякий ви можете перевірити за допомогою dpkg -L libffi-dev@tushar_ecmc
Ben-xue

15
Зауважте, що якщо ви склали власний дистрибутив Python (наприклад, через pyenv install), вам потрібно буде перекомпілювати розподіл після встановлення пакета.
недільний

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.

ОНОВЛЕННЯ ЛІГА

Схоже, я сказав, що доповнив би цю відповідь ще деяким поясненням, і через два роки мені не доведеться багато додати.

  • Ця публікація пояснює, чому певні бібліотеки, на кшталт цього, python-devможуть знадобитися.
  • Ця публікація ТА пояснює, чому в команді make можна використовувати аргумент на altinstallпротивагу installаргументу .

Крім цього, я думаю, що вибором було б читання кодової бази cpython, шукаючи #includeдирективи, які потрібно виконати, але те, що я зазвичай роблю, - це намагатися встановити пакет і просто читати через вихід, встановлюючи необхідні пакети, поки він не буде вдається.

Нагадує мені історію Інженера, Менеджера та Програміста, чия машина котиться в гору .


3
Фантастичний. Тепер, чи можете ви сказати мені, як ви отримали список вище? За допомогою спроб та помилок? : -O
Veky

4
Чесно кажучи, @Veky я зробив пошук в Інтернеті про помилку, "ImportError: Немає модуля з назвою" _ctypes "", і, мабуть, спробував кілька речей, перш ніж він працював. Буде оновлено відповідь, щоб уточнити моє мізерне розуміння APT, Python, make тощо.
MikeiLL

Це має бути python3-devзамість python-dev. python-devздається для python2.
Тімо

Чому б ви клонували репо-код вихідного коду, а потім використовували 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-ботанік

Дякую за відповідь, найвищий голос мав повний список, який я, мабуть, потребував, але це нагадало мені перевстановитись pyenv, щоб реально налагодити роботу. Використовувати pyenv - це набагато простіше, ніж захопити вихідний код і makeточно виконати всі речі.
dragon788

Це працювало для мене на Ubuntu. Простий і ефективний.
Філ

Дякую, це було корисно. Повний список необхідних умов для pyenv відвідайте github.com/pyenv/pyenv/wiki/Common-build-problems#prerequisites
Paweł Mucha

Вам не потрібно спочатку видаляти Python. Якщо встановити його ще раз, перекомпілюйте бінарний Python, і ось що потрібно.
RusI

22

Детальні кроки для встановлення Python 3.7 в CentOS або будь-якій машині redhat linux:

  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


2
це було позначено як низька якість, і я дивлюся на це у черзі на огляд. це насправді не працює як самостійна відповідь. Я рекомендую видалити, але, можливо, ви можете покращити його, розширивши його?
dbliss

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. Я alsmot відмовився від libffi.
Олександр Фулар

3

Зверніться до цієї нитки або цієї нитки , для індивідуальної установки libffi, Python3.7 важко знайти місце розташування бібліотеки libffi. Альтернативним методом є встановлення CONFIGURE_LDFLAGSзмінної, наприклад, у Makefile CONFIGURE_LDFLAGS="-L/path/to/libffi-3.2.1/lib64".


Посилання розірвано. Я намагався внести зміни в Makefile, як ви показуєте тут, але це не вийшло. _ctypes все ще не створюється.
користувач5915738

Я додав ще одне посилання.
пенгі

2

Моє рішення: Установка libffi-dev за допомогою apt-get не допомогла. Але це допомогло: Встановлення libffi з джерела та встановлення Python 3.8 з джерела.

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

Крок за кроком:

Я отримав повідомлення про помилку "ModuleNotFoundError: Немає модуля з назвою" _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 та автоматична автоматична перевірка. Вони вже були встановлені в моїй системі.
  • конфігуруйте libffi без документів:

./configure --disable-docs

make check

sudo make install

Після цього моя установка python могла знайти _ctypes.



0

Якщо ви не заперечуєте проти використання Miniconda , необхідні зовнішні бібліотеки та _ctypes встановлені за замовчуванням. Це займає більше місця і може зажадати використання помірно старшої версії Python (наприклад, 3.7.6 замість 3.8.2 на цей текст).


0

Ви повинні завантажити відсутні файли php3 (Python3) з менеджера пакунків. Якщо у вас є Ubuntu, я рекомендую Synaptic Package Manager:

sudo apt-get install synaptic

Там ви можете просто шукати відсутні модулі. пошук типів та встановлення всіх пакетів. Потім перейдіть до свого Python dir і зробіть

./configure
make install.

Це повинно вирішити вашу проблему.


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 / Програмне забезпечення / бібліотека / libffi / instalacija / lib64' - це шлях до каталогу інсталяції LIBFFI, де знаходиться libffi.so. І, / home / user123 / Програмне забезпечення / Python / installation3 / - це шлях до каталогу встановлення Python. Змініть їх відповідно до вашого випадку.


-1

Якщо ви щось робите, тут ніхто вас не слухатиме, тому що "ви робите це неправильно", але ви повинні робити це "неправильно" з причини, що викликає асинін (наприклад, у моєму випадку це швидко руйнується на недобре слова про когось у матір'ю команди з надмірною вагою матері), потрібно спочатку:

Отримайте 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

і додайте рядок, який я позначив вище, за допомогою коментаря. Чому це потрібно і чому немає можливості налаштувати конфігурацію на повагу '--with-system-ffi` на платформах Linux, можливо, я дізнаюся, чому це "непідтримується" протягом наступних двох годин, але все має працював з тих пір. Інакше, удачі ... YMMV.

Що це робить: просто переосмислює логіку і призводить до того, що команда компілятора, що зв'язує, додає "-lffi", що є все, що йому дійсно потрібно. Якщо у вас встановлена ​​користувачка бібліотеки, вона, ймовірно, визначає колонтитули добре, доки ви не PKG_CONFIG_PATHвключені path/to/your/install/root/lib/pkgconfig.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.