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.

htc_m8
źródło
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
dotbit
źródło
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 .

MikeiLL
źródło
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

Evgeniy
źródło
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
Alok Deep
źródło
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

SE Furgeson
źródło
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 .

akpp
źródło
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

Arash Mohammadi
źródło
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".

pengchy
źródło
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.

Rolf Kampffmeyer
źródło
2

To rozwiązało ten sam błąd dla mnie w Debianie :

sudo apt-get install libffi-dev

i skompiluj ponownie

Numer referencyjny: issue31652

hassanzadeh.sd
źródło
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).

Christopher Bottoms
źródło
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.

Anthony S.
źródło
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.

Bhanuday Sharma
źródło
-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.

slowkoni
źródło