Python3: ImportError: Brak modułu o nazwie `` _ctypes '' podczas korzystania z funkcji Value from module multiprocessing


127

Używam Ubuntu i zainstalowałem Python 2.7.5 i 3.4.0. W Pythonie 2.7.5 mogę z powodzeniem przypisać zmienną x = Value('i', 2), ale nie w 3.4.0. Staje się:

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'

Właśnie zaktualizowałem do wersji 3.3.2, instalując źródło 3.4.0. Został zainstalowany w /usr/local/lib/python3.4 .

Czy zaktualizowałem Python 3.4 poprawnie?

Zauważyłem jedną rzecz, że Python 3.4 jest zainstalowany w usr / local / lib , podczas gdy Python 3.3.2 jest nadal zainstalowany w usr / lib , więc nie został nadpisany.


Wygląda na to, że podczas „instalowania źródła 3.4.0” coś się zepsuło. Co to dokładnie oznacza? Czy to polecenie działało w wersji 3.3.2?
— Mechanical_meat

Zainstalowałem z kodu źródłowego za pomocą polecenia sudo make install. Tak, importowanie wartości z przetwarzania wieloprocesowego działało w wersji 3.3.2
— htc_m8

8
_ctypesnie został zbudowany, ponieważ libffi-devzależność nie była dostępna. Zamiast tego rozważ użycie PPA z martwych węży .
— Eryk Sun

11
Zainstalowanie libffi-dev i ponowna instalacja Pythona 3.4 rozwiązało problem
— htc_m8

Odpowiedzi:


227

Zainstalowanie libffi-devi ponowne zainstalowanie Pythona3.7 rozwiązało problem.

czyste zbudowanie py 3.7 libffi-dev jest wymagane, w przeciwnym razie później coś się nie powiedzie

Jeśli używasz RHEL / Fedora:

yum install libffi-devel

lub

sudo dnf install libffi-devel

Jeśli używasz Debian / Ubuntu:

sudo apt-get install libffi-dev

35
Zainstalowałem, libffi-devale nadal otrzymuję ten błąd
— tushar_ecmc

2
Jeśli używasz linux ,, wykonaj, ldconfigaby załadować nowy plik libffi.so. Głównym celem apt-get install libffi-devjest zainstalowanie pliku o nazwie, libffi.soktóry możesz sprawdzić przez dpkg -L libffi-dev@tushar_ecmc
— Ben-xue

15
Zauważ, że jeśli skompilowałeś swoją własną dystrybucję Pythona (np. Poprzez pyenv install), będziesz musiał ponownie skompilować dystrybucję po zainstalowaniu pakietu.
— nedned

121

Na nowym obrazie Debiana, klonowanie https://github.com/python/cpython i uruchamianie:

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

Teraz uruchom configureplik sklonowany powyżej:

./configure
make # alternatively `make -j 4` will utilize 4 threads
sudo make altinstall

Mam zainstalowany 3.7 i działa dla mnie.

NIEWIELKA AKTUALIZACJA

Wygląda na to, że powiedziałem, że zaktualizuję tę odpowiedź o więcej wyjaśnień, a dwa lata później nie mam wiele do dodania.

  • ten wpis SO wyjaśnia, dlaczego niektóre biblioteki, takie jak, python-devmogą być konieczne.
  • ten post SO wyjaśnia, dlaczego w poleceniu make można użyć w altinstallprzeciwieństwie do installargumentu .

Poza tym wydaje mi się, że wybór będzie polegał na przeczytaniu bazy kodu cpython w poszukiwaniu #includedyrektyw, które muszą być spełnione, ale zwykle próbuję zainstalować pakiet i po prostu czytać dane wyjściowe instalując wymagane pakiety, aż to nastąpi udaje się.

Przypomina mi historię Inżyniera, Menadżera i Programisty, którego samochód stacza się ze wzgórza .


3
Fantastyczny. Czy możesz mi teraz powiedzieć, skąd masz powyższą listę? Metodą prób i błędów? : -O
— Veky

4
Szczerze, @Veky wyszukałem w sieci błąd „ImportError: brak modułu o nazwie„ _ctypes ”” i zacząłem kopać, prawdopodobnie wypróbowałem kilka rzeczy, zanim zadziałało. Zaktualizuję odpowiedź, aby wyjaśnić moje skąpe zrozumienie APT, Pythona,
— marki

Powinien być python3-devzamiast python-dev. python-devwydaje się python2.
— Timo,

Dlaczego miałbyś sklonować repozytorium kodu źródłowego, a następnie użyć sudo apt-get? To po prostu nie ma sensu. sudo apt-getobsługuje pobieranie już skompilowanego kodu, więc dlaczego pobierasz kod, a następnie go nie używasz?
— Ryan

1
@MikeiLL Zdałem sobie sprawę, że wszystkie sudoinstrukcje instalują wymagania wstępne, aby rozpocząć tworzenie pobranego kodu źródłowego. ./configurei makerzeczy wymaga te rzeczy, które mają być zainstalowane.
— Ryan

30

Jeśli używasz pyenv i otrzymujesz błąd „Brak modułu o nazwie„ _ctypes ”” (tak jak ja) w systemie Debian / Raspbian / Ubuntu, musisz uruchomić następujące polecenia:

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

Umieść swoją wersję Pythona zamiast 3.7.6


Witamy w przepełnieniu stosu. Czy możesz podać więcej informacji? Referencje itp. I zajrzyj na stackoverflow.com/help/how-to-answer
— Nodejs-nerd

Dziękuję za odpowiedź. Najwyższy głos miał pełną listę, której prawdopodobnie potrzebowałem, ale przypomniało mi to o ponownej instalacji przez pyenv, aby wszystko działało. Korzystanie z pyenv jest o wiele łatwiejsze niż pobieranie kodu źródłowego i robienie wszystkiego makena pewno.
— dragon788

To działało dla mnie na Ubuntu. Proste i skuteczne.
— Phil

Dzięki, to było pomocne. Pełna lista wymagań wstępnych dla pyenv znajduje się na stronie github.com/pyenv/pyenv/wiki/Common-build-problems#prerequisites
— Paweł Mucha

Nie musisz najpierw odinstalowywać Pythona. Samo zainstalowanie go ponownie spowoduje przekompilowanie pliku binarnego Pythona i to jest potrzebne.
— RusI

22

Szczegółowe kroki instalacji Pythona 3.7 w CentOS lub dowolnej maszynie redhat z systemem Linux:

  1. Pobierz Python z https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
  2. Wypakuj zawartość do nowego folderu
  3. Otwórz Terminal w tym samym katalogu
  4. Uruchom poniższy kod krok po kroku:
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

Pomyślałem, że dodam instalacje Centos:

sudo yum -y install gcc gcc-c++ 
sudo yum -y install zlib zlib-devel
sudo yum -y install libffi-devel 

Sprawdź wersję Pythona:

python3 -V

Utwórz virtualenv:

virtualenv -p python3 venv


2
zostało to oznaczone jako niskiej jakości i patrzę na to w kolejce recenzji. to naprawdę nie działa jako samodzielna odpowiedź. mam zamiar zalecić usunięcie, ale może możesz to poprawić, rozszerzając go?
— dbliss

11

Biegnę do tego błędu, gdy próbowałem zainstalować Python 3.7.3 w Ubuntu 18.04 z następnego polecenia: $ pyenv install 3.7.3. Instalacja powiodła się po uruchomieniu $ sudo apt-get update && sudo apt-get install libffi-dev(jak sugerowano tutaj ). Problem został rozwiązany tam .


6

Żadne z rozwiązań nie zadziałało. Musisz ponownie skompilować Pythona; gdy wszystkie wymagane pakiety zostały całkowicie zainstalowane.

Obserwuj to:

  1. Zainstaluj wymagane pakiety
  2. Biegać ./configure --enable-optimizations

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


2
Właściwie świetna odpowiedź. Wszyscy wspominają, że potrzebujesz libffi-devel i że to by to rozwiązało, problem polega na tym, że musisz również ponownie skompilować Pythona. Ja też zrezygnowałem z libffi.
— Aleksander Fular

3

Zapoznaj się z tym wątkiem lub tym wątkiem , aby uzyskać niestandardową instalację libffi, Python3.7 ma trudności ze znalezieniem lokalizacji biblioteki libffi. Alternatywną metodą jest na przykład ustawienie CONFIGURE_LDFLAGSzmiennej w pliku Makefile CONFIGURE_LDFLAGS="-L/path/to/libffi-3.2.1/lib64".


Link jest uszkodzony. Próbowałem dokonać modyfikacji w Makefile, tak jak tu pokazujesz, ale to nie zadziałało. _ctypes nadal nie tworzy.
— user5915738

Dodałem kolejny link do wątku.
— pengchy

2

Moje rozwiązanie: instalacja libffi-dev za pomocą apt-get nie pomogła. Ale to pomogło: instalacja libffi ze źródła, a następnie zainstalowanie Pythona 3.8 ze źródła.

Moja konfiguracja: Ubuntu 16.04 LTS Python 3.8.2

Krok po kroku:

Otrzymałem komunikat o błędzie „ModuleNotFoundError: brak modułu o nazwie„ _ctypes ”” podczas uruchamiania debugera z programu Visual Studio Code i podczas uruchamiania python3 -c "import sklearn; sklearn.show_versions()".

  • pobierz libffi v3.3 ze strony https://github.com/libffi/libffi/releases
  • install libtool: sudo apt-get install libtool plik README.md z libffi wspomina, że ​​konieczne są również autoconf i automake. Zostały już zainstalowane w moim systemie.
  • skonfiguruj libffi bez dokumentów:

./configure --disable-docs

make check

sudo make install

Po tym moja instalacja Pythona mogła znaleźć _ctypes.



0

Jeśli nie masz nic przeciwko używaniu Minicondy , niezbędne biblioteki zewnętrzne i _ctypes są instalowane domyślnie. Zajmuje więcej miejsca i może wymagać użycia nieco starszej wersji Pythona (np. 3.7.6 zamiast 3.8.2 w chwili pisania tego tekstu).


0

Musisz załadować brakujące moduły php3 (Python3) z menedżera pakietów. Jeśli masz Ubuntu, polecam Synaptic Package Manager:

sudo apt-get install synaptic

Tam możesz po prostu wyszukać brakujące moduły. wyszukaj ctypes i zainstaluj wszystkie pakiety. Następnie przejdź do swojego katalogu Python i zrób

./configure
make install.

To powinno rozwiązać twój problem.


0

Miałem ten sam problem. Żadne z powyższych rozwiązań nie zadziałało. Głównym wyzwaniem było to, że nie miałem dostępu do roota. Więc najpierw pobieram źródło libffi. Następnie skompilowałem go za pomocą zwykłych poleceń:

./configure --prefix=desired_installation_path_to_libffi
make 

Następnie ponownie skompilowałem Pythona za pomocą

./configure --prefix=/home/user123/Softwares/Python/installation3/  LDFLAGS='-L/home/user123/Softwares/library/libffi/installation/lib64'
make 
make install

W moim przypadku „home / user123 / Softwares / library / libffi / installation / lib64” to ścieżka do katalogu instalacyjnego LIBFFI, w którym znajduje się libffi.so. A / home / user123 / Softwares / Python / installation3 / to ścieżka do katalogu instalacyjnego Pythona. Zmodyfikuj je zgodnie ze swoim przypadkiem.


-1

Jeśli coś robisz, nikt cię tutaj nie posłucha, ponieważ "robisz to w zły sposób", ale musisz to zrobić "w niewłaściwy sposób" z powodów zbyt głupich (na przykład w moim przypadku szybko się to psuje słowa o kimś w zespole devops z nadwagą matką), najpierw musisz:

Pobierz libffi i zainstaluj go w obszarze instalacji użytkownika w zwykły sposób.

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

Następnie wróć do źródła Python 3 i znajdź tę część kodu w setup.py na najwyższym poziomie katalogu źródłowego Pythona

        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

i dodaj wiersz, który zaznaczyłem powyżej z komentarzem. Dlaczego jest to konieczne i dlaczego nie ma sposobu, aby skonfigurować przestrzeganie „--without-system-ffi” na platformach Linux, być może dowiem się, dlaczego jest to „nieobsługiwane” w ciągu najbliższych kilku godzin, ale wszystko pracował od tamtej pory. W przeciwnym razie powodzenia ... YMMV.

CO ROBI: po prostu nadpisuje tam logikę i powoduje, że polecenie łączenia kompilatora dodaje „-lffi”, czyli wszystko, czego naprawdę potrzebuje. Jeśli masz bibliotekę zainstalowaną przez użytkownika, prawdopodobnie wykrywa ona nagłówki dobrze, o ile PKG_CONFIG_PATHzawiera ona path/to/your/install/root/lib/pkgconfig.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.