Python3: ImportError: Nenhum módulo chamado '_ctypes' ao usar o valor do multiprocessamento do módulo

127

Estou usando o Ubuntu e instalei o Python 2.7.5 e 3.4.0. No Python 2.7.5, consigo atribuir uma variável com sucesso x = Value('i', 2), mas não no 3.4.0. Estou obtendo:

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'

Acabei de atualizar para 3.3.2 através da instalação do código-fonte 3.4.0. Ele foi instalado em /usr/local/lib/python3.4 .

Eu atualizei para Python 3.4 corretamente?

Uma coisa que percebi é que o Python 3.4 está instalado em usr / local / lib , enquanto o Python 3.3.2 ainda está instalado em usr / lib , portanto não foi sobrescrito.

htc_m8
fonte
Parece que algo estragou durante a "instalação do código-fonte do 3.4.0". O que isso significa exatamente? Esse comando estava funcionando em 3.3.2?
Mechanical_meat
Instalei a partir do código-fonte usando o comando sudo make install. Sim, a importação de valor de multiprocessamento funcionou em 3.3.2
htc_m8
8
_ctypesnão foi criado porque a libffi-devdependência não estava disponível. Considere usar o Deadsnakes PPA .
Eryk Sun
11
Instalar libffi-dev e reinstalar python3.4 corrigiu o problema para mim
htc_m8

Respostas:

226

Instalar libffi-deve reinstalar o python3.7 corrigiu o problema para mim.

para compilar de forma limpa o py 3.7 libffi-dev é necessário ou então o material irá falhar

Se estiver usando RHEL / Fedora:

yum install libffi-devel

ou

sudo dnf install libffi-devel

Se estiver usando Debian / Ubuntu:

sudo apt-get install libffi-dev
dotbit
fonte
35
Eu instalei, libffi-devmas ainda estou recebendo este erro
tushar_ecmc
2
Se você estiver usando Linux, execute ldconfigpara carregar o novo libffi.so. O objetivo principal do apt-get install libffi-devé instalar um arquivo chamado libffi.soque você pode verificar por dpkg -L libffi-dev@tushar_ecmc
Ben-xue
14
Observe que se você compilou sua própria distribuição Python (por exemplo pyenv install, por meio ), você precisará recompilar a distribuição após instalar o pacote.
encerrado em
121

Em uma nova imagem do Debian, clonando https://github.com/python/cpython e executando:

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

Agora execute o configurearquivo clonado acima:

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

Tenho o 3.7 instalado e funcionando para mim.

LEVE ATUALIZAÇÃO

Parece que eu disse que atualizaria esta resposta com mais algumas explicações e, dois anos depois, não tenho muito a acrescentar.

  • este post do SO explica porque certas bibliotecas como python-devpodem ser necessárias.
  • este post do SO explica por que se pode usar o argumento altinstalloposto ao installdo comando make .

Além disso, acho que a escolha seria ler a base de código cpython procurando por #includediretivas que precisam ser atendidas, mas o que eu normalmente faço é continuar tentando instalar o pacote e apenas continuar lendo a saída instalando os pacotes necessários até que tem sucesso.

Lembra-me a história do Engenheiro, do Gerente e do Programador cujo carro desce uma ladeira .

MikeiLL
fonte
3
Fantástico. Agora, você pode me dizer como você conseguiu a lista acima? Por tentativa e erro? : -O
Veky de
4
Honestamente, @Veky eu fiz uma pesquisa na web pelo erro, "ImportError: Nenhum módulo chamado '_ctypes'" e procurei, provavelmente tentei algumas coisas antes de funcionar. Atualizará a resposta para esclarecer com meu pouco conhecimento de APT, Python, make, etc.
MikeiLL
Deve ser em python3-devvez de python-dev. python-devparece para python2.
Timo,
Por que você clonaria um repositório de código-fonte e, em seguida, usaria sudo apt-get? Isso simplesmente não faz sentido. sudo apt-getlida com o download de código já compilado, então por que você baixa o código e não o usa?
Ryan
1
@MikeiLL Percebi que todas as sudoinstruções são pré-requisitos de instalação para construir o código-fonte que você baixou. o ./configuree makeoutras coisas requerem que essas coisas sejam instaladas.
Ryan
29

Se você usar o pyenv e receber o erro "Nenhum módulo chamado '_ctypes'" (como eu) no Debian / Raspbian / Ubuntu, você precisará executar estes comandos:

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

Coloque sua versão de python em vez de 3.7.6

Evgeniy
fonte
Bem-vindo ao estouro de pilha. Voce pode fornecer mais informação? Referências etc. e dê uma olhada em stackoverflow.com/help/how-to-answer
Nodejs-nerd
Obrigado pela resposta, o mais votado tinha a lista completa de que eu provavelmente precisava, mas isso me lembrou de reinstalar via pyenvpara realmente fazer as coisas funcionarem. Usar o pyenv é muito mais fácil do que pegar o código-fonte e fazer todas as makecoisas com certeza.
dragon788
Isso funcionou para mim no Ubuntu. Simples e eficaz.
Phil
Obrigado, isso foi útil. Para uma lista completa de pré-requisitos para pyenv, visite github.com/pyenv/pyenv/wiki/Common-build-problems#prerequisites
Paweł Mucha
Você não precisa desinstalar o Python primeiro. Apenas instalá-lo novamente irá recompilar o binário Python e é isso que é necessário.
RusI
22

Etapas detalhadas para instalar o Python 3.7 no CentOS ou em qualquer máquina Linux redhat:

  1. Baixe Python em https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
  2. Extraia o conteúdo em uma nova pasta
  3. Abra o Terminal no mesmo diretório
  4. Execute o código abaixo passo a passo:
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
fonte
14

Pensei em adicionar as instalações do Centos:

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

Verifique a versão do python:

python3 -V

Crie virtualenv:

virtualenv -p python3 venv

SE Furgeson
fonte
2
isso foi sinalizado como de baixa qualidade e estou olhando para ele na fila de revisão. realmente não funciona como uma resposta independente. Vou recomendar a exclusão, mas talvez você possa melhorar expandindo-o?
dbliss
11

Eu me deparo com esse erro quando tentei instalar o Python 3.7.3 no Ubuntu 18.04 com o próximo comando: $ pyenv install 3.7.3. A instalação foi bem-sucedida após a execução $ sudo apt-get update && sudo apt-get install libffi-dev(como sugerido aqui ). O problema foi resolvido .

akpp
fonte
6

Nenhuma das soluções funcionou. Você tem que recompilar seu python novamente; uma vez que todos os pacotes necessários foram completamente instalados.

Siga isso:

  1. Instale os pacotes necessários
  2. Corre ./configure --enable-optimizations

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

Arash Mohammadi
fonte
2
Ótima resposta, na verdade. Todo mundo menciona que você precisa do libffi-devel e que isso resolveria, o problema é que você também precisa recompilar o python. Eu também desisti da libffi.
Aleksander Fular
3

Consulte este tópico , para instalação personalizada de libffi, é difícil para Python3.7 encontrar a localização da biblioteca de libffi. Um método alternativo é definir a CONFIGURE_LDFLAGSvariável no Makefile, por exemplo CONFIGURE_LDFLAGS="-L/path/to/libffi-3.2.1/lib64".

pengchy
fonte
O link está quebrado. Tentei fazer a modificação no Makefile como você mostra aqui, mas não funcionou. _ctypes ainda não está construindo.
user5915738
2

Minha solução: Instalar libffi-dev com apt-get não ajudou. Mas isso ajudou: instalar o libffi do código-fonte e depois instalar o Python 3.8 do código-fonte.

Minha configuração: Ubuntu 16.04 LTS Python 3.8.2

Passo a passo:

Recebi a mensagem de erro "ModuleNotFoundError: Nenhum módulo chamado '_ctypes'" ao iniciar o depurador a partir do Visual Studio Code e ao executar python3 -c "import sklearn; sklearn.show_versions()".

  • baixe libffi v3.3 em https://github.com/libffi/libffi/releases
  • instalar libtool: sudo apt-get install libtool O arquivo README.md da libffi menciona que autoconf e automake também são necessários. Eles já foram instalados no meu sistema.
  • configure libffi sem documentos:

./configure --disable-docs

make check

sudo make install

Depois disso, minha instalação do python pode encontrar _ctypes.

Rolf Kampffmeyer
fonte
2

Isso resolveu o mesmo erro para mim no Debian :

sudo apt-get install libffi-dev

e compilar novamente

Referência: issue31652

hassanzadeh.sd
fonte
0

Se você não se importa em usar o Miniconda , as bibliotecas externas necessárias e _ctypes são instalados por padrão. Ele ocupa mais espaço e pode exigir o uso de uma versão moderadamente mais antiga do Python (por exemplo, 3.7.6 em vez de 3.8.2 no momento desta escrita).

Christopher Bottoms
fonte
0

Você tem que carregar os módulos php3 (Python3) ausentes do gerenciador de pacotes. Se você tem o Ubuntu, eu recomendo Synaptic Package Manager:

sudo apt-get install synaptic

Lá, você pode simplesmente pesquisar os módulos ausentes. procure por ctypes e instale todos os pacotes. Em seguida, vá para o seu diretório Python e faça

./configure
make install.

Isso deve resolver seu problema.

AnthonyS
fonte
0

Eu estava tendo o mesmo problema. Nenhuma das soluções acima funcionou para mim. O principal desafio era que eu não tinha acesso root. Então, primeiro faço o download do código-fonte da libffi. Então eu o compilei com os comandos usuais:

./configure --prefix=desired_installation_path_to_libffi
make 

Então eu recompilei o python usando

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

No meu caso, 'home / user123 / Softwares / library / libffi / installation / lib64' é o caminho para o diretório de instalação do LIBFFI onde libffi.so está localizado. E / home / user123 / Softwares / Python / installation3 / é o caminho para o diretório de instalação do Python. Modifique-os de acordo com seu caso.

Bhanuday Sharma
fonte
-1

Se você está fazendo algo, ninguém aqui vai ouvi-lo porque "você está fazendo da maneira errada", mas você tem que fazer "da maneira errada" por motivos muito estúpidos (por exemplo, no meu caso, rapidamente se transforma em algo sujo palavras sobre alguém na equipe devops (mãe com excesso de peso), você precisa primeiro:

Obtenha o libffi e instale-o na área de instalação do usuário da maneira usual.

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

Em seguida, volte ao seu código-fonte Python 3 e encontre esta parte do código em setup.py no nível superior do diretório de código-fonte 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

e adicione a linha que marquei acima com o comentário. Por que é necessário, e por que não há como configurar para respeitar '--without-system-ffi` em plataformas Linux, talvez eu descubra por que isso é "não suportado" nas próximas horas, mas tudo tem trabalhou desde então. Caso contrário, boa sorte ... YMMV.

O QUE FAZ: apenas sobrescreve a lógica ali e faz com que o comando de vinculação do compilador adicione "-lffi" que é tudo o que ele realmente precisa. Se você tiver a biblioteca instalada pelo usuário, provavelmente ela está detectando bem os cabeçalhos, desde que PKG_CONFIG_PATHinclua path/to/your/install/root/lib/pkgconfig.

slowkoni
fonte