Python3: ImportError: Modül çoklu işlemeden Değer kullanılırken "_ctypes" adlı modül yok


127

Ubuntu kullanıyorum ve Python 2.7.5 ve 3.4.0'ı kurdum. Python 2.7.5'te bir değişkeni başarıyla atayabiliyorum x = Value('i', 2), ancak 3.4.0'da değil. Alıyorum:

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.4.0 kaynağını yükleyerek 3.3.2'ye güncelledim. /Usr/local/lib/python3.4 içine kuruldu .

Python 3.4'e doğru güncelleme yaptım mı?

Python 3.4'ün usr / local / lib'de kurulu olduğunu, Python 3.3.2'nin hala usr / lib'de kurulu olduğunu fark ettim , bu yüzden üzerine yazılmadı.


Görünüşe göre "3.4.0 kaynağının yüklenmesi" sırasında bir şeyler kirlenmiş. Bu tam olarak ne anlama geliyor? Bu komut 3.3.2'de çalışıyor muydu?
mechanical_meat

Sudo make install komutunu kullanarak kaynak koddan yükledim. Evet, çoklu
işlemden

8
_ctypeslibffi-devbağımlılık mevcut olmadığı için inşa edilmedi. Bunun yerine ölü yılanlar PPA'yı kullanmayı düşünün .
Eryk Paz

11
Libffi

Yanıtlar:


229

libffi-devPython3.7'yi kurmak ve yeniden kurmak sorunu benim için çözdü.

temiz bir şekilde py 3.7 oluşturmak libffi-dev gereklidir, aksi takdirde daha sonra işler başarısız olur

RHEL / Fedora kullanıyorsanız:

yum install libffi-devel

veya

sudo dnf install libffi-devel

Debian / Ubuntu kullanıyorsanız:

sudo apt-get install libffi-dev

35
Ben yüklemiş libffi-devama hala bu hatayı alıyorum
tushar_ecmc

2
Linux kullanıyorsanız, yenisini ldconfigyüklemek için yürütün libffi.so. Asıl amacı, @tushar_ecmc ile kontrol edebileceğiniz apt-get install libffi-devadlı bir dosya kurmaktırlibffi.sodpkg -L libffi-dev
Ben-xue

15
Kendi Python dağıtımınızı derlediyseniz (örneğin aracılığıyla pyenv install), paketi kurduktan sonra dağıtımı yeniden derlemeniz gerekeceğini unutmayın.
nedned

121

Yeni bir Debian görüntüsünde, https://github.com/python/cpython'u klonlayarak ve çalıştırarak:

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

Şimdi configureyukarıda klonlanan dosyayı çalıştırın :

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

3.7 yüklü ve benim için çalışıyor.

HAFİF GÜNCELLEME

Görünüşe göre bu cevabı biraz daha açıklamayla güncelleyeceğimi söyledim ve iki yıl sonra ekleyecek pek bir şeyim yok.

  • Bu SO gönderisi , bazı kütüphanelerin neden python-devgerekli olabileceğini açıklıyor .
  • bu SO gönderisi , make komutundaki argüman altinstallyerine neden birinin kullanılabileceğini açıklıyor .install

Bunun dışında, seçimin ya #includekarşılanması gereken yönergeleri aramak için cpython kod tabanını okumak olacağını tahmin ediyorum , ancak genellikle yaptığım şey paketi kurmaya çalışmak ve sadece gerekli paketleri yükleyene kadar çıktıyı okumaya devam etmektir. başarılı olur.

Bana , arabası tepeden aşağı yuvarlanan Mühendis, Yönetici ve Programcının hikayesini hatırlatıyor .


3
Fantastik. Şimdi, yukarıdaki listeye nasıl sahip olduğunuzu söyler misiniz? Deneme yanılma yoluyla? : -O
Veky

4
Dürüst olmak gerekirse, @Veky "ImportError: '_ctypes' adlı modül yok" hatası için bir web araması yaptım ve etrafı kazdım, muhtemelen çalışmadan önce birkaç şey denedim. APT, Python, make, vb.
Konusundaki

Bunun python3-devyerine olmalı python-dev. python-deviçin görünüyor python2.
Timo

Neden bir kaynak kod deposunu klonlayıp sonra kullanasınız sudo apt-get? Bu hiç mantıklı değil. sudo apt-getönceden derlenmiş kodun indirilmesini yönetir, öyleyse neden kodu indirip sonra kullanmıyorsunuz?
Ryan

1
@MikeiLL İndirdiğiniz sudokaynak kodunu oluşturmak için tüm ifadelerin ön koşulları yüklediğini fark ettim . ./configureve makemalzeme bu şeyler yüklenmesini gerektiriyor.
Ryan

30

Pyenv kullanıyorsanız ve Debian / Raspbian / Ubuntu'da "'_ctypes' adlı modül yok" (benim gibi) hatası alırsanız, şu komutları çalıştırmanız gerekir:

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

3.7.6 yerine python sürümünüzü koyun


Yığın taşmasına hoş geldiniz. Daha fazla bilgi verebilir misiniz? Referanslar vb. Ve stackoverflow.com/help/how-to-answer
Nodejs-nerd

Cevabınız için teşekkürler, en yüksek oyu alan muhtemelen ihtiyacım olan tam listeye sahipti, ancak bu, pyenvişleri gerçekten yürütmek için yeniden yüklememi hatırlattı . Pyenv kullanmak, kaynak kodunu almaktan ve her makeşeyi kesin olarak yapmaktan çok daha kolaydır .
dragon788

Bu benim için Ubuntu'da çalıştı. Basit ve etkili.
Phil

Teşekkürler, bu yardımcı oldu. Pyenv ön koşullarının tam listesi için github.com/pyenv/pyenv/wiki/Common-build-problems#prerequisites
Paweł Mucha

Önce Python'u kaldırmanıza gerek yoktur. Sadece tekrar kurmanız, Python ikili dosyasını yeniden derleyecektir ve gerekli olan budur.
RusI

22

Python 3.7'yi CentOS veya herhangi bir redhat linux makinesine kurmak için ayrıntılı adımlar:

  1. Python'u https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz adresinden indirin
  2. İçeriği yeni klasöre çıkarın
  3. Aynı dizinde Terminal'i açın
  4. Aşağıdaki kodu adım adım çalıştırın:
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 kurulumlarını ekleyeceğimi düşündüm:

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

Python sürümünü kontrol edin:

python3 -V

Virtualenv oluştur:

virtualenv -p python3 venv


2
bu düşük kaliteli olarak işaretlendi ve inceleme sırasında ona bakıyorum. gerçekten tek başına bir cevap olarak çalışmıyor. Silmeyi tavsiye edeceğim, ancak onu genişleterek iyileştirebilirsiniz.
dbliss

11

Ben yüklemeye çalıştığında bu hata çalıştırın Python 3.7.3 yılında Ubuntu 18.04 sonraki komut ile: $ pyenv install 3.7.3. Çalıştırdıktan sonra yükleme başarılı oldu $ sudo apt-get update && sudo apt-get install libffi-dev( burada önerildiği gibi ). Sorun orada çözüldü .


6

Çözümlerin hiçbiri işe yaramadı. Python'unuzu yeniden derlemelisiniz; gerekli tüm paketler tamamen kurulduktan sonra.

Bunu takip et:

  1. Gerekli paketleri yükleyin
  2. Çalıştırmak ./configure --enable-optimizations

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


2
Aslında harika cevap. Herkes libffi-devel'e ihtiyacınız olduğundan ve bunun çözüleceğinden bahsediyor, sorun da python'u yeniden derlemeniz gerektiğidir. Ben de libffi'den vazgeçtim.
Aleksander Fular

3

Bu iş parçacığına veya bu iş parçacığına bakın , libffi'nin özelleştirilmiş kurulumu için, Python3.7'nin libffi'nin kitaplık konumunu bulması zordur. CONFIGURE_LDFLAGSÖrneğin alternatif bir yöntem, değişkeni Makefile'da ayarlamaktır CONFIGURE_LDFLAGS="-L/path/to/libffi-3.2.1/lib64".


Bağlantı koptu. Makefile'da burada gösterdiğiniz gibi değişiklik yapmaya çalıştım ama işe yaramadı. _ctypes hala oluşturulmuyor.
user5915738

Başka bir konu bağlantısı ekledim.
pengchy

2

Çözümüm: libffi-dev'i apt-get ile kurmak yardımcı olmadı. Ancak bu yardımcı oldu: libffi'yi kaynaktan yüklemek ve sonra Python 3.8'i kaynaktan yüklemek.

Yapılandırmam: Ubuntu 16.04 LTS Python 3.8.2

Adım adım:

Hata ayıklayıcıyı Visual Studio Code'dan başlatırken ve çalıştırırken "ModuleNotFoundError: '_ctypes' adlı modül yok" hata iletisini aldım python3 -c "import sklearn; sklearn.show_versions()".

./configure --disable-docs

make check

sudo make install

Bundan sonra python kurulumum _ctypes bulabilir.



0

Miniconda kullanmaktan rahatsız olmazsanız , gerekli harici kitaplıklar ve _ctypes varsayılan olarak yüklenir. Daha fazla yer kaplar ve Python'un orta derecede eski bir sürümünü kullanmayı gerektirebilir (örneğin, bu yazıda 3.8.2 yerine 3.7.6).


0

Paket yöneticisinden eksik php3 (Python3) modüllerini yüklemeniz gerekir. Ubuntu'nuz varsa şunları tavsiye ederim Synaptic Package Manager:

sudo apt-get install synaptic

Orada eksik modülleri kolayca arayabilirsiniz. ctype'ları arayın ve tüm paketleri kurun. Ardından Python dizine gidin ve

./configure
make install.

Bu probleminizi çözmeli.


0

Ben de aynı sorunu yaşıyordum. Yukarıdaki çözümlerden hiçbiri benim için işe yaramadı. Temel zorluk, root erişimine sahip olmamamdı. Bu yüzden önce libffi'nin kaynağını indiriyorum. Sonra bunu normal komutlarla derledim:

./configure --prefix=desired_installation_path_to_libffi
make 

Sonra python'u kullanarak yeniden derledim

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

Benim durumumda, 'home / user123 / Softwares / library / libffi / installation / lib64', libffi.so'nun bulunduğu LIBFFI kurulum dizininin yoludur. Ve / home / user123 / Softwares / Python / installation3 /, Python kurulum dizininin yoludur. Bunları durumunuza göre değiştirin.


-1

Eğer bir şey yapıyorsanız, burada kimse sizi dinlemeyecek çünkü "yanlış şekilde yapıyorsunuz", ama çok aptalca nedenlerle bunu "yanlış yoldan" yapmanız gerekiyor (örneğin, benim durumumda hızla faul haline geliyor devops ekibindeki biriyle ilgili sözler fazla kilolu anne), önce yapmanız gerekenler:

Libffi'yi edinin ve her zamanki gibi kullanıcı kurulum alanınıza kurun.

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

Ardından Python 3 kaynağınıza geri dönün ve kodun bu bölümünü python kaynak dizininin en üst düzeyinde setup.py'de bulun

        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

ve yukarıda işaretlediğim satırı yorumla birlikte ekleyin. Neden gerekli ve neden Linux platformlarında "sistem-ffi" olmadan saygı duymak için yapılandırılmanın bir yolu yok, belki bunun neden "desteklenmediğini" önümüzdeki birkaç saat içinde bulabilirim, ama her şeyde o zamandan beri çalıştı. Aksi takdirde, bol şans ... YMMV.

NE YAPAR: sadece oradaki mantığı geçersiz kılar ve derleyici bağlama komutunun gerçekten ihtiyacı olan "-lffi" eklemesine neden olur. Kitaplığı kullanıcı tarafından yüklediyseniz, büyük olasılıkla başlıklarınızı PKG_CONFIG_PATHiçerdiği sürece iyi algılıyor demektir path/to/your/install/root/lib/pkgconfig.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.