Python3: ImportError: Không có mô-đun nào có tên '_ctypes' khi sử dụng Giá trị từ xử lý đa mô-đun


127

Tôi đang sử dụng Ubuntu và đã cài đặt Python 2.7.5 và 3.4.0. Trong Python 2.7.5, tôi có thể gán thành công một biến x = Value('i', 2), nhưng không phải trong 3.4.0. Tôi đang nhận được:

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'

Tôi vừa cập nhật lên 3.3.2 thông qua cài đặt mã nguồn của 3.4.0. Nó được cài đặt trong /usr/local/lib/python3.4 .

Tôi đã cập nhật lên Python 3.4 đúng cách chưa?

Một điều tôi nhận thấy rằng Python 3.4 được cài đặt trong usr / local / lib , trong khi Python 3.3.2 vẫn được cài đặt trong usr / lib , vì vậy nó không bị ghi đè.


Có vẻ như một cái gì đó đã bị lỗi trong quá trình "cài đặt nguồn của 3.4.0". điều đó chính xác có nghĩa là gì? Lệnh đó có hoạt động trong 3.3.2 không?
Mechanical_meat,

Tôi đã cài đặt từ mã nguồn bằng lệnh sudo make install. Có đang nhập Giá trị từ quá trình đa xử lý đã hoạt động trong 3.3.2
htc_m8

8
_ctypeskhông được xây dựng vì libffi-devphụ thuộc không có sẵn. Thay vào đó, hãy cân nhắc sử dụng PPA deadsnakes .
Eryk Sun

11
Cài đặt libffi-dev và cài đặt lại python3.4 cố định vấn đề đối với tôi
htc_m8

Câu trả lời:


226

Cài đặt libffi-devvà cài đặt lại python3.7 đã khắc phục sự cố cho tôi.

để xây dựng rõ ràng py 3.7 libffi-dev là cần thiết, nếu không sau này sẽ không thành công

Nếu sử dụng RHEL / Fedora:

yum install libffi-devel

hoặc là

sudo dnf install libffi-devel

Nếu sử dụng Debian / Ubuntu:

sudo apt-get install libffi-dev

35
Tôi đã cài đặt libffi-devnhưng tôi vẫn nhận được lỗi này
tushar_ecmc

2
Nếu bạn đang sử dụng linux, hãy thực thi ldconfigđể tải cái mới libffi.so. Mục đích chính của apt-get install libffi-devnó là cài đặt một tệp có tên libffi.somà bạn có thể kiểm tra nó bằng dpkg -L libffi-dev@tushar_ecmc
Ben-xue

14
Lưu ý rằng nếu bạn đã biên dịch thì bạn đang sở hữu bản phân phối Python (ví dụ: thông qua pyenv install), bạn sẽ cần phải biên dịch lại bản phân phối sau khi cài đặt gói.
gần

121

Trên ảnh Debian mới, sao chép https://github.com/python/cpython và chạy:

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

Bây giờ thực thi configuretệp đã sao chép ở trên:

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

Đã cài đặt 3.7 và hoạt động cho tôi.

CẬP NHẬT TRƯỢT

Có vẻ như tôi đã nói rằng tôi sẽ cập nhật câu trả lời này với một số giải thích hơn và hai năm sau tôi không có nhiều thứ để bổ sung.

  • bài đăng SO này giải thích tại sao một số thư viện như thế này lại python-devcần thiết.
  • bài đăng SO này giải thích tại sao người ta có thể sử dụng altinstallđối installsố trái ngược với đối số trong lệnh make .

Bên cạnh đó, tôi đoán lựa chọn sẽ là đọc qua codebase cpython để tìm kiếm các #includechỉ thị cần được đáp ứng, nhưng những gì tôi thường làm là tiếp tục cài đặt gói và chỉ tiếp tục đọc qua đầu ra cài đặt các gói cần thiết cho đến khi thành công.

Làm tôi nhớ đến câu chuyện của Kỹ sư, Người quản lý và Người lập trình có chiếc xe lăn xuống một ngọn đồi .


3
Tuyệt diệu. Bây giờ, bạn có thể cho tôi biết làm thế nào bạn có được danh sách trên? Bằng cách thử và sai? : -O
Veky

4
Thành thật mà nói, @Veky Tôi đã tìm kiếm trên web cho lỗi, "ImportError: Không có mô-đun nào có tên '_ctypes'" và đã tìm hiểu kỹ, có thể đã thử một vài điều trước khi nó hoạt động. Sẽ cập nhật câu trả lời để làm rõ với sự hiểu biết của tôi rất ít của APT, Python, làm cho vv
MikeiLL

Nó nên được python3-devthay vì python-dev. python-devdường như cho python2.
Timo

Tại sao bạn lại sao chép một kho mã nguồn và sau đó sử dụng sudo apt-get? Điều đó chẳng có nghĩa lý gì. sudo apt-getxử lý việc tải xuống mã đã được biên dịch, vậy tại sao bạn tải mã xuống rồi không sử dụng?
Ryan

1
@MikeiLL Tôi nhận ra rằng tất cả các sudocâu lệnh đang cài đặt điều kiện tiên quyết để xây dựng mã nguồn bạn đã tải xuống. các ./configuremakenhững thứ đòi hỏi những điều cần được cài đặt.
Ryan

28

Nếu bạn sử dụng pyenv và gặp lỗi "Không có mô-đun nào có tên '_ctypes'" (giống như tôi) trên Debian / Raspbian / Ubuntu, bạn cần chạy lệnh sau:

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

Đặt phiên bản python của bạn thay vì 3.7.6


Chào mừng bạn đến với tràn ngăn xếp. bạn có thể cung cấp thêm thông tin không? Tham khảo, v.v. và xem stackoverflow.com/help/how-to-answer
Nodejs-nerd

Cảm ơn câu trả lời, người được bình chọn cao nhất đã có danh sách đầy đủ mà tôi có thể cần, nhưng điều này nhắc tôi phải cài đặt lại pyenvđể mọi thứ thực sự hoạt động. Sử dụng pyenv dễ dàng hơn so với lấy mã nguồn và làm tất cả những makethứ chắc chắn.
dragon788

Điều này đã làm việc cho tôi trên Ubuntu. Đơn giản và hiệu quả.
Phil

Cảm ơn, điều đó rất hữu ích. Để biết danh sách đầy đủ điều kiện tiên quyết cho pyenv, hãy truy cập github.com/pyenv/pyenv/wiki/Common-build-problems#prerequisites
Paweł Mucha

Bạn không cần phải gỡ cài đặt Python trước. Chỉ cần cài đặt lại nó sẽ biên dịch lại mã nhị phân Python và đó là những gì cần thiết.
RusI

22

Các bước chi tiết để cài đặt Python 3.7 trong CentOS hoặc bất kỳ máy Linux redhat nào:

  1. Tải xuống Python từ https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
  2. Giải nén nội dung trong thư mục mới
  3. Mở Terminal trong cùng một thư mục
  4. Chạy mã dưới đây từng bước:
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

Tôi nghĩ rằng tôi sẽ thêm các cài đặt Centos:

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

Kiểm tra phiên bản python:

python3 -V

Tạo virtualenv:

virtualenv -p python3 venv


2
điều này đã được gắn cờ là chất lượng thấp và tôi đang xem nó trong hàng đợi đánh giá. nó thực sự không hoạt động như một câu trả lời độc lập. Tôi sẽ khuyên bạn nên xóa, nhưng có thể bạn có thể cải thiện nó bằng cách mở rộng nó?
dbliss

11

Tôi chạy vào lỗi này khi tôi đã cố gắng để cài đặt Python 3.7.3 trong Ubuntu 18,04 với lệnh tiếp theo: $ pyenv install 3.7.3. Cài đặt thành công sau khi chạy $ sudo apt-get update && sudo apt-get install libffi-dev(như được đề xuất ở đây ). Vấn đề đã được giải quyết ở đó .


6

Không có giải pháp nào hoạt động. Bạn phải biên dịch lại python của mình một lần nữa; khi tất cả các gói yêu cầu đã được cài đặt hoàn chỉnh.

Làm theo điều này:

  1. Cài đặt các gói bắt buộc
  2. Chạy ./configure --enable-optimizations

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


2
Câu trả lời tuyệt vời thực sự. Mọi người đều nói rằng bạn cần libffi-devel và nó sẽ giải quyết được nó, vấn đề là bạn cũng cần phải biên dịch lại python. Tôi đã từ bỏ libffi.
Aleksander Fular

3

Tham khảo luồng này , để cài đặt tùy chỉnh libffi, rất khó để Python3.7 tìm vị trí thư viện của libffi. Một phương pháp thay thế là đặt CONFIGURE_LDFLAGSbiến trong Makefile chẳng hạn CONFIGURE_LDFLAGS="-L/path/to/libffi-3.2.1/lib64".


Liên kết bị hỏng. Tôi đã cố gắng thực hiện sửa đổi trong Makefile như bạn hiển thị ở đây nhưng nó không hoạt động. _ctypes vẫn chưa được xây dựng.
user5915738

2

Giải pháp của tôi: Cài đặt libffi-dev với apt-get không giúp được gì. Nhưng điều này đã hữu ích: Cài đặt libffi từ nguồn và sau đó cài đặt Python 3.8 từ nguồn.

Cấu hình của tôi: Ubuntu 16.04 LTS Python 3.8.2

Từng bước một:

Tôi nhận được thông báo lỗi "ModuleNotFoundError: Không có mô-đun nào có tên '_ctypes'" khi khởi động trình gỡ lỗi từ Visual Studio Code và khi chạy python3 -c "import sklearn; sklearn.show_versions()".

  • tải xuống libffi v3.3 từ https://github.com/libffi/libffi/releases
  • cài đặt libtool: sudo apt-get install libtool Tệp README.md từ libffi đề cập rằng autoconf và automake cũng cần thiết. Chúng đã được cài đặt trên hệ thống của tôi.
  • định cấu hình libffi mà không cần tài liệu:

./configure --disable-docs

make check

sudo make install

Sau đó, cài đặt python của tôi có thể tìm thấy _ctypes.


2

Điều này đã giải quyết được cùng một lỗi cho tôi trên Debian :

sudo apt-get install libffi-dev

và biên dịch lại

Tham khảo: issue31652


0

Nếu bạn không phiền khi sử dụng Miniconda , các thư viện bên ngoài và _ctypes cần thiết được cài đặt theo mặc định. Nó chiếm nhiều dung lượng hơn và có thể yêu cầu sử dụng phiên bản Python cũ hơn vừa phải (ví dụ: 3.7.6 thay vì 3.8.2 như trong bài viết này).


0

Bạn phải tải các mô-đun php3 (Python3) bị thiếu từ trình quản lý gói. Nếu bạn có Ubuntu, tôi khuyên bạn nên Synaptic Package Manager:

sudo apt-get install synaptic

Ở đó bạn có thể đơn giản tìm kiếm các mô-đun bị thiếu. tìm kiếm ctypes và cài đặt tất cả các gói. Sau đó, truy cập dir Python của bạn và làm

./configure
make install.

Điều này sẽ giải quyết vấn đề của bạn.


0

Tôi đã có cùng một vấn đề. Không có giải pháp nào ở trên phù hợp với tôi. Thách thức quan trọng là tôi không có quyền truy cập root. Vì vậy, trước tiên tôi tải về nguồn của libffi. Sau đó, tôi biên dịch nó bằng các lệnh thông thường:

./configure --prefix=desired_installation_path_to_libffi
make 

Sau đó, tôi đã biên dịch lại python bằng cách sử dụng

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

Trong trường hợp của tôi, 'home / user123 / Softwares / library / libffi / install / lib64' là đường dẫn đến thư mục cài đặt LIBFFI nơi chứa libffi.so. Và, / home / user123 / Softwares / Python / install3 / là đường dẫn đến thư mục cài đặt Python. Sửa đổi chúng theo trường hợp của bạn.


-1

Nếu bạn đang làm điều gì đó, không ai ở đây sẽ lắng nghe bạn vì "bạn đang làm sai cách", nhưng bạn phải làm "sai cách" vì lý do quá asinine (ví dụ, trong trường hợp của tôi, nó nhanh chóng biến chất thành mùi hôi. những từ về ai đó trong đội devops là mẹ thừa cân), trước tiên bạn cần:

Nhận libffi và cài đặt nó vào khu vực cài đặt người dùng của bạn theo cách thông thường.

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

Sau đó, quay lại nguồn Python 3 của bạn và tìm phần mã này trong setup.py ở cấp cao nhất của thư mục nguồn 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

và thêm dòng tôi đã đánh dấu ở trên với nhận xét. Tại sao nó lại cần thiết và tại sao không có cách nào để cấu hình được tôn trọng '--without-system-ffi` trên nền tảng Linux, có lẽ tôi sẽ tìm hiểu lý do tại sao điều đó "không được hỗ trợ" trong vài giờ tới, nhưng mọi thứ đều có hoạt động kể từ đó. Nếu không, chúc may mắn ... YMMV.

LÀM GÌ: chỉ ghi đè logic ở đó và khiến lệnh liên kết trình biên dịch thêm "-lffi", đó là tất cả những gì nó thực sự cần. Nếu bạn đã cài đặt thư viện cho người dùng, nó có thể phát hiện các tiêu đề tốt miễn là PKG_CONFIG_PATHbao gồm của bạn path/to/your/install/root/lib/pkgconfig.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.