Python3: ImportError: Tidak ada modul bernama '_ctypes' saat menggunakan Value dari modul multiprocessing

127

Saya menggunakan Ubuntu dan telah menginstal Python 2.7.5 dan 3.4.0. Dengan Python 2.7.5 saya berhasil menetapkan variabel x = Value('i', 2), tetapi tidak di 3.4.0. Saya mendapatkan:

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'

Saya baru saja memperbarui ke 3.3.2 dengan menginstal sumber 3.4.0. Itu diinstal di /usr/local/lib/python3.4 .

Apakah saya memperbarui ke Python 3.4 dengan benar?

Satu hal yang saya perhatikan bahwa Python 3.4 diinstal di usr / local / lib , sedangkan Python 3.3.2 masih diinstal di usr / lib , jadi tidak ditimpa.

htc_m8
sumber
Tampaknya ada sesuatu yang salah selama "menginstal sumber 3.4.0". Apa sebenarnya maksudnya itu? Apakah perintah itu berfungsi di 3.3.2?
mechanical_meat
Saya menginstal dari kode sumber menggunakan perintah sudo make install. Ya, mengimpor Nilai dari multiprosesing bekerja di 3.3.2
htc_m8
8
_ctypestidak dibuat karena libffi-devdependensi tidak tersedia. Pertimbangkan untuk menggunakan PPA deadsnakes sebagai gantinya.
Eryk Sun
11
Menginstal libffi-dev dan menginstal ulang python3.4 memperbaiki masalah bagi saya
htc_m8

Jawaban:

226

Menginstal libffi-devdan menginstal ulang python3.7 memperbaiki masalah bagi saya.

untuk membangun py 3.7 dengan rapi libffi-dev diperlukan atau hal lain nanti akan gagal

Jika menggunakan RHEL / Fedora:

yum install libffi-devel

atau

sudo dnf install libffi-devel

Jika menggunakan Debian / Ubuntu:

sudo apt-get install libffi-dev
dotbit
sumber
35
Saya telah menginstal libffi-devtetapi saya masih mendapatkan kesalahan ini
tushar_ecmc
2
Jika Anda menggunakan linux, jalankan ldconfiguntuk memuat yang baru libffi.so. Tujuan utamanya apt-get install libffi-devadalah untuk menginstal file bernama libffi.soyang dapat Anda periksa oleh dpkg -L libffi-dev@tushar_ecmc
Ben-xue
14
Perhatikan bahwa jika Anda telah mengkompilasi distribusi Python Anda sendiri (misalnya melalui pyenv install), Anda perlu mengkompilasi ulang distribusi tersebut setelah menginstal paket.
berakhir
121

Pada gambar Debian baru, kloning https://github.com/python/cpython dan jalankan:

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

Sekarang jalankan configurefile kloning di atas:

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

Mendapat 3,7 terinstal dan bekerja untuk saya.

PEMBARUAN SEDIKIT

Sepertinya saya mengatakan saya akan memperbarui jawaban ini dengan beberapa penjelasan lagi dan dua tahun kemudian saya tidak punya banyak hal untuk ditambahkan.

  • posting SO ini menjelaskan mengapa perpustakaan tertentu seperti python-devmungkin diperlukan.
  • posting SO ini menjelaskan mengapa seseorang dapat menggunakan altinstallsebagai lawan installargumen dalam perintah make .

Selain itu, saya kira pilihannya adalah membaca basis kode cpython yang dicari #include arahan yang perlu dipenuhi, tetapi yang biasanya saya lakukan adalah terus mencoba menginstal paket dan terus membaca output menginstal paket yang diperlukan sampai itu berhasil.

Mengingatkan saya pada kisah Insinyur, Manajer, dan Programmer yang mobilnya menuruni bukit .

MikeiLL
sumber
3
Fantastis. Sekarang, dapatkah Anda ceritakan bagaimana Anda mendapatkan daftar di atas? Dengan coba-coba? : -O
Veky
4
Sejujurnya, @Veky saya melakukan pencarian web untuk kesalahan, "ImportError: Tidak ada modul bernama '_ctypes'" dan menggali, mungkin mencoba beberapa hal sebelum berhasil. Akan memperbarui jawaban untuk memperjelas dengan pemahaman saya yang sedikit tentang APT, Python, make, dll.
MikeiLL
Seharusnya python3-devbukan python-dev. python-devtampaknya python2.
Timo
Mengapa Anda mengkloning repo kode sumber, dan kemudian menggunakan sudo apt-get? Itu tidak masuk akal. sudo apt-getmenangani pengunduhan kode yang sudah dikompilasi, jadi mengapa Anda mengunduh kode dan kemudian tidak menggunakannya?
Ryan
1
@MikeiLL Saya menyadari semua sudopernyataan menginstal prasyarat untuk membangun kode sumber yang Anda unduh. yang ./configuredan makebarang-barang membutuhkan hal-hal yang akan diinstal.
Ryan
29

Jika Anda menggunakan pyenv dan mendapatkan kesalahan "Tidak ada modul bernama '_ctypes'" (seperti saya) di Debian / Raspbian / Ubuntu, Anda perlu menjalankan perintah ini:

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

Gunakan versi python Anda, bukan 3.7.6

Evgeniy
sumber
Selamat datang di stack overflow. Bisakah Anda memberikan lebih banyak informasi? Referensi dll dan lihat stackoverflow.com/help/how-to-answer
Nodejs-nerd
Terima kasih atas jawabannya, suara terbanyak memiliki daftar lengkap yang mungkin saya perlukan, tetapi ini mengingatkan saya untuk menginstal ulang melalui pyenvagar benar-benar berfungsi. Menggunakan pyenv jauh lebih mudah daripada mengambil kode sumber dan melakukan semua makehal dengan pasti.
dragon788
Ini berhasil untuk saya di Ubuntu. Sederhana dan efektif.
Phil
Terima kasih, itu sangat membantu. Untuk daftar lengkap prasyarat pyenv, kunjungi github.com/pyenv/pyenv/wiki/Common-build-problems#prerequisites
Paweł Mucha
Anda tidak perlu menghapus Python terlebih dahulu. Hanya menginstalnya lagi akan mengkompilasi ulang biner Python dan itulah yang dibutuhkan.
RusI
22

Langkah-langkah terperinci untuk menginstal Python 3.7 di CentOS atau mesin redhat linux:

  1. Unduh Python dari https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
  2. Ekstrak konten di folder baru
  3. Buka Terminal di direktori yang sama
  4. Jalankan kode di bawah ini selangkah demi selangkah:
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
sumber
14

Pikir saya akan menambahkan instalasi Centos:

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

Periksa versi python:

python3 -V

Buat virtualenv:

virtualenv -p python3 venv

SE Furgeson
sumber
2
ini ditandai sebagai kualitas rendah, dan saya sedang melihatnya dalam antrean tinjauan. ini benar-benar tidak berfungsi sebagai jawaban yang berdiri sendiri. Saya akan merekomendasikan penghapusan, tetapi mungkin Anda dapat memperbaikinya dengan memperluasnya?
Bliss
11

Saya mengalami error ini ketika saya mencoba untuk menginstal Python 3.7.3 di Ubuntu 18.04 dengan perintah selanjutnya: $ pyenv install 3.7.3. Pemasangan berhasil setelah berjalan $ sudo apt-get update && sudo apt-get install libffi-dev(seperti yang disarankan di sini ). Masalahnya terpecahkan di sana .

akpp
sumber
6

Tidak ada solusi yang berhasil. Anda harus mengkompilasi ulang python Anda lagi; setelah semua paket yang dibutuhkan terinstal sepenuhnya.

Ikuti ini:

  1. Instal paket yang diperlukan
  2. Lari ./configure --enable-optimizations

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

Arash Mohammadi
sumber
2
Jawaban yang bagus sebenarnya. Semua orang menyebutkan bahwa Anda memerlukan libffi-devel dan itu akan menyelesaikannya, masalahnya adalah Anda juga perlu mengkompilasi ulang python. Saya juga tidak menyerah pada libffi.
Aleksander Fular
3

Lihat utas ini , untuk instalasi libffi yang disesuaikan, sulit bagi Python3.7 untuk menemukan lokasi perpustakaan libffi. Metode alternatif adalah mengatur CONFIGURE_LDFLAGSvariabel di Makefile, misalnya CONFIGURE_LDFLAGS="-L/path/to/libffi-3.2.1/lib64".

pengchy
sumber
Tautannya rusak. Saya mencoba membuat modifikasi di Makefile seperti yang Anda tunjukkan di sini tetapi tidak berhasil. _ctypes masih belum dibuat.
pengguna5915738
2

Solusi saya: Menginstal libffi-dev dengan apt-get tidak membantu. Tetapi ini membantu: Menginstal libffi dari sumber dan kemudian menginstal Python 3.8 dari sumber.

Konfigurasi saya: Ubuntu 16.04 LTS Python 3.8.2

Selangkah demi selangkah:

Saya mendapat pesan galat "ModuleNotFoundError: Tidak ada modul bernama '_ctypes'" saat memulai debugger dari Visual Studio Code, dan saat menjalankan python3 -c "import sklearn; sklearn.show_versions()".

  • unduh libffi v3.3 dari https://github.com/libffi/libffi/releases
  • install libtool: sudo apt-get install libtool File README.md dari libffi menyebutkan bahwa autoconf dan automake juga diperlukan. Mereka sudah terinstal di sistem saya.
  • konfigurasikan libffi tanpa dokumen:

./configure --disable-docs

make check

sudo make install

Setelah itu instalasi python saya bisa menemukan _ctypes.

Rolf Kampffmeyer
sumber
2

Ini memecahkan kesalahan yang sama untuk saya di Debian :

sudo apt-get install libffi-dev

dan kompilasi lagi

Referensi: issue31652

hassanzadeh.sd
sumber
0

Jika Anda tidak keberatan menggunakan Miniconda , pustaka eksternal dan _ctypes yang diperlukan diinstal secara default. Itu memang membutuhkan lebih banyak ruang dan mungkin perlu menggunakan versi Python yang agak lebih tua (misalnya 3.7.6 daripada 3.8.2 pada tulisan ini).

Christopher Bottoms
sumber
0

Anda harus memuat modul php3 (Python3) yang hilang dari manajer paket. Jika Anda memiliki Ubuntu, saya merekomendasikan Synaptic Package Manager:

sudo apt-get install synaptic

Di sana Anda cukup mencari modul yang hilang. cari ctypes dan instal semua paket. Lalu pergi ke dir Python Anda dan lakukan

./configure
make install.

Ini seharusnya menyelesaikan masalah Anda.

AnthonyS
sumber
0

Saya mengalami masalah yang sama. Tidak ada solusi di atas yang berhasil untuk saya. Tantangan utamanya adalah saya tidak memiliki akses root. Jadi, saya unduh dulu sumber libffi. Lalu saya kompilasi dengan perintah biasa:

./configure --prefix=desired_installation_path_to_libffi
make 

Kemudian saya mengkompilasi ulang python menggunakan

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

Dalam kasus saya, 'home / user123 / Softwares / library / libffi / installation / lib64' adalah jalur ke direktori instalasi LIBFFI tempat libffi.so berada. Dan, / home / user123 / Softwares / Python / installation3 / adalah jalur ke direktori instalasi Python. Ubah sesuai kasus Anda.

Bhanuday Sharma
sumber
-1

Jika Anda melakukan sesuatu, tidak ada orang di sini yang akan mendengarkan Anda karena "Anda melakukannya dengan cara yang salah", tetapi Anda harus melakukannya "dengan cara yang salah" karena alasan yang terlalu konyol (misalnya, dalam kasus saya, hal itu dengan cepat berubah menjadi busuk kata-kata tentang seseorang di tim pengembang ibu kelebihan berat badan), Anda harus terlebih dahulu:

Dapatkan libffi dan instal ke area instal pengguna Anda seperti biasa.

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

Kemudian kembali ke sumber Python 3 Anda dan temukan bagian kode ini di setup.py di tingkat atas direktori sumber 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

dan tambahkan baris yang telah saya tandai di atas dengan komentar. Mengapa itu perlu, dan mengapa tidak ada cara untuk mendapatkan konfigurasi untuk menghormati '--tanpa-sistem-ffi` pada platform Linux, mungkin saya akan mencari tahu mengapa itu "tidak didukung" dalam beberapa jam ke depan, tetapi semuanya telah bekerja sejak itu. Jika tidak, semoga sukses ... YMMV.

APA YANG DILAKUKAN: hanya menimpa logika di sana dan menyebabkan perintah penghubung kompilator menambahkan "-lffi" yang memang dibutuhkannya. Jika Anda memiliki pustaka yang diinstal pengguna, itu mungkin mendeteksi header dengan baik selama Anda PKG_CONFIG_PATHmenyertakannya path/to/your/install/root/lib/pkgconfig.

slowkoni
sumber