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 /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อ้างอิง ลองใช้PPA ของ Deadsnakesแทน
Eryk Sun

11
การติดตั้ง libffi-dev และการติดตั้ง python3.4 ใหม่ช่วยแก้ไขปัญหาให้ฉัน
htc_m8

คำตอบ:


229

การติดตั้งlibffi-devและติดตั้ง python3.7 ใหม่ช่วยแก้ปัญหาให้ฉัน

ในการสร้าง py 3.7 ให้หมดจด libffi-dev นั้นจำเป็นต้องมีมิฉะนั้นสิ่งอื่น ๆ ในภายหลังจะล้มเหลว

หากใช้ 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) คุณจะต้องรวบรวมการแจกจ่ายอีกครั้งหลังจากติดตั้งแพคเกจ
nedned

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 แล้วและใช้งานได้สำหรับฉัน

อัพเดท SLIGHT

ดูเหมือนว่าฉันจะบอกว่าฉันจะอัปเดตคำตอบนี้พร้อมคำอธิบายเพิ่มเติมและอีกสองปีต่อมาฉันไม่มีอะไรจะเพิ่ม

  • โพสต์ SO นี้อธิบายว่าเหตุใดไลบรารีบางแห่งpython-devจึงจำเป็น
  • โพสต์ SO นี้อธิบายว่าเหตุใดจึงอาจใช้สิ่งaltinstallที่ตรงข้ามกับinstallอาร์กิวเมนต์ในคำสั่งmake

นอกเหนือจากนั้นฉันเดาว่าทางเลือกน่าจะเป็นการอ่านผ่าน cpython codebase เพื่อค้นหา#includeคำสั่งที่ต้องปฏิบัติตาม แต่สิ่งที่ฉันมักจะทำคือพยายามติดตั้งแพ็คเกจต่อไปและอ่านผลลัพธ์ที่ติดตั้งแพ็คเกจที่ต้องการจนกว่าจะถึง ประสบความสำเร็จ

ทำให้ฉันนึกถึงเรื่องราวของวิศวกรผู้จัดการและโปรแกรมเมอร์ที่รถกลิ้งลงเขาผู้จัดการและโปรแกรมเมอร์ที่มีรถม้วนลงเนินเขา


3
น่าอัศจรรย์ ตอนนี้คุณบอกฉันได้ไหมว่าคุณมีรายชื่อด้านบนได้อย่างไร โดยการลองผิดลองถูก? : -O
Veky

4
สุจริต @Veky ฉันค้นหาข้อผิดพลาดบนเว็บ "ImportError: ไม่มีโมดูลชื่อ '_ctypes'" และขุดไปรอบ ๆ อาจจะลองสองสามอย่างก่อนที่จะทำงาน จะอัปเดตคำตอบเพื่อชี้แจงด้วยความเข้าใจที่ไม่เพียงพอของฉันเกี่ยวกับ APT, Python, make และอื่น ๆ
MikeiLL

มันควรจะเป็นแทนpython3-dev ดูเหมือนว่า python-devpython-devpython2
Timo

ทำไมคุณจะโคลนแหล่งรหัส repo และจากนั้นใช้sudo apt-get? นั่นไม่สมเหตุสมผลเลย sudo apt-getจัดการการดาวน์โหลดโค้ดที่คอมไพล์แล้วเหตุใดคุณจึงดาวน์โหลดโค้ดแล้วไม่ใช้งาน
Ryan

1
@MikeiLL ฉันรู้ว่าข้อความทั้งหมดsudoกำลังติดตั้งข้อกำหนดเบื้องต้นเพื่อสร้างซอร์สโค้ดที่คุณดาวน์โหลดมา ./configureและmakeสิ่งที่ต้องมีสิ่งเหล่านั้นที่จะติดตั้ง
Ryan

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


ยินดีต้อนรับสู่ stack overflow คุณสามารถให้ข้อมูลเพิ่มเติมได้หรือไม่? การอ้างอิง ฯลฯ และดูได้ที่stackoverflow.com/help/how-to-answer
Nodejs-nerd

ขอบคุณสำหรับคำตอบผู้ที่ได้รับการโหวตสูงสุดมีรายการทั้งหมดที่ฉันน่าจะต้องการ แต่สิ่งนี้เตือนให้ฉันติดตั้งใหม่pyenvเพื่อให้สิ่งต่างๆใช้งานได้จริง การใช้ pyenv นั้นง่ายกว่าการคว้าซอร์สโค้ดและทำทุกอย่างmakeอย่างแน่นอน
dragon788

สิ่งนี้ใช้ได้กับฉันบน Ubuntu ง่ายและมีประสิทธิภาพ
ฟิลิป

ขอบคุณที่เป็นประโยชน์ สำหรับรายการข้อกำหนดเบื้องต้นทั้งหมดสำหรับ pyenv โปรดไปที่github.com/pyenv/pyenv/wiki/Common-build-pro
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. เปิด Terminal ในไดเร็กทอรีเดียวกัน
  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 

ตรวจสอบเวอร์ชันหลาม:

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 ใหม่ด้วย ฉันยอมแพ้กับ libffi
Aleksander Fular

3

อ้างถึงเธรดนี้หรือเธรดนี้สำหรับการติดตั้ง libffi แบบกำหนดเองเป็นเรื่องยากสำหรับ Python3.7 ในการค้นหาตำแหน่งไลบรารีของ libffi วิธีทางเลือกคือการตั้งค่าCONFIGURE_LDFLAGSตัวแปรใน Makefile CONFIGURE_LDFLAGS="-L/path/to/libffi-3.2.1/lib64"ตัวอย่างเช่น


ลิงค์เสีย ฉันพยายามทำการแก้ไขใน Makefile ตามที่คุณแสดงที่นี่ แต่มันไม่ได้ผล _ctypes ยังไม่สร้าง
user5915738

ฉันได้เพิ่มลิงค์กระทู้อื่นแล้ว
pengchy

2

วิธีแก้ปัญหาของฉัน: การติดตั้ง libffi-dev ด้วย apt-get ไม่ได้ช่วยอะไร แต่สิ่งนี้ช่วยได้: การติดตั้ง libffi จากซอร์สแล้วติดตั้ง Python 3.8 จากซอร์ส

การกำหนดค่าของฉัน: Ubuntu 16.04 LTS Python 3.8.2

เป็นขั้นเป็นตอน:

ฉันได้รับข้อความแสดงข้อผิดพลาด "ModuleNotFoundError: ไม่มีโมดูลชื่อ '_ctypes" เมื่อเริ่มต้นจากการดีบัก Visual Studio 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 และ automake ก็จำเป็นเช่นกัน มีการติดตั้งในระบบของฉันแล้ว
  • กำหนดค่า libffi โดยไม่มีเอกสาร:

./configure --disable-docs

make check

sudo make install

หลังจากนั้นการติดตั้ง python ของฉันก็พบ _ctypes


2

สิ่งนี้แก้ไขข้อผิดพลาดเดียวกันสำหรับฉันในDebian :

sudo apt-get install libffi-dev

และรวบรวมอีกครั้ง

อ้างอิง: issue31652


0

หากคุณไม่ต้องการใช้Minicondaไลบรารีภายนอกและ _ctypes ที่จำเป็นจะถูกติดตั้งตามค่าเริ่มต้น ใช้พื้นที่มากขึ้นและอาจต้องใช้ Python เวอร์ชันเก่ากว่าพอสมควร (เช่น 3.7.6 แทนที่จะเป็น 3.8.2 ในขณะที่เขียนนี้)


0

คุณต้องโหลดโมดูล php3 (Python3) ที่หายไปจากตัวจัดการแพ็คเกจ หากคุณมี Ubuntu ฉันขอแนะนำSynaptic Package Manager:

sudo apt-get install synaptic

คุณสามารถค้นหาโมดูลที่หายไปได้ที่นั่น ค้นหา ctypes และติดตั้งแพ็คเกจทั้งหมด จากนั้นไปที่ 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 / Softwares / library / libffi / installation / lib64' คือพา ธ ไปยังไดเร็กทอรีการติดตั้ง LIBFFI ที่ libffi.so ตั้งอยู่ และ / home / user123 / Softwares / Python / installation3 / คือพา ธ ไปยังไดเร็กทอรีการติดตั้ง Python ปรับเปลี่ยนตามกรณีของคุณ


-1

หากคุณกำลังทำอะไรบางอย่างที่นี่จะไม่มีใครฟังคุณเพราะ "คุณกำลังทำผิดวิธี" แต่คุณต้องทำ "วิธีที่ผิด" ด้วยเหตุผลเช่นกัน (เช่นในกรณีของฉันมันเสื่อมสภาพอย่างรวดเร็ว คำพูดเกี่ยวกับใครบางคนในทีม devops แม่ที่มีน้ำหนักเกิน) ก่อนอื่นคุณต้อง:

รับ 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

และเพิ่มบรรทัดที่ฉันได้ทำเครื่องหมายไว้ด้านบนพร้อมกับความคิดเห็น เหตุใดจึงจำเป็นและเหตุใดจึงไม่มีวิธีกำหนดค่าให้เคารพ "- โดยไม่มีระบบ -fi` บนแพลตฟอร์ม Linux บางทีฉันอาจจะพบว่าเหตุใดจึง" ไม่รองรับ "ในสองสามชั่วโมงถัดไป แต่ทุกอย่างมี ทำงานตั้งแต่นั้นเป็นต้นมา มิฉะนั้นขอให้โชคดี ... YMMV.

มันทำอะไร: เพียงแค่แทนที่ตรรกะตรงนั้นและทำให้คำสั่งลิงก์คอมไพเลอร์เพิ่ม "-lffi" ซึ่งเป็นสิ่งที่จำเป็นจริงๆ หากคุณติดตั้งไลบรารีโดยผู้ใช้อาจตรวจพบส่วนหัวได้ดีตราบเท่าที่คุณPKG_CONFIG_PATHรวมpath/to/your/install/root/lib/pkgconfigไว้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.