Erro do Python "ImportError: nenhum módulo chamado"

452

Python é instalado em um diretório local.

Minha árvore de diretórios fica assim:

(local directory)/site-packages/toolkit/interface.py

Meu código está aqui:

(local directory)/site-packages/toolkit/examples/mountain.py

Para executar o exemplo, escrevo python mountain.pye no código que tenho:

from toolkit.interface import interface

E eu recebo o erro:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

Eu já verifiquei sys.pathe lá tenho o diretório /site-packages. Além disso, tenho o arquivo __init__.py.binna pasta do kit de ferramentas para indicar ao Python que este é um pacote. Eu também tenho um __init__.py.binno diretório de exemplos.

Eu não sei por que Python não consegue encontrar o arquivo quando ele está em sys.path. Alguma ideia? Pode ser um problema de permissões? Preciso de alguma permissão de execução?

Eduardo
fonte
3
Verifique se você tem permissão de leitura para esse arquivo no python. Veja: stackoverflow.com/a/20999950/1657225
cSn
1
Certifique-se de marcar seu diretório como "Raiz de Recursos" para informar ao PyCharm que este é um pacote.
emmmphd
O problema no meu caso era que não havia permissão para os módulos recém-instalados 755. Isso ocorreu porque umaska máquina era 0027devido à qual othersnão havia readpermissão, fazendo com que o módulo não fosse lido. A adição de readpermissão corrigiu meu problema. Vale a pena verificar a permissão do diretório de destino pós-instalação.
anu
Tente soprar o URL: stackoverflow.com/questions/47887614/…
Rawan-25
talvez o nome do diretório local seja interface (tenha sido um conflito).
Benyamin Jafari

Respostas:

267

Com base nos seus comentários no post do orip, acho que foi o que aconteceu:

  1. Você editou __init__.pyno Windows.
  2. O editor do Windows adicionou algo que não é de impressão, talvez um retorno de carro (o final de linha no Windows é CR / LF; no unix é apenas LF) ou talvez um CTRL-Z (final de arquivo do Windows).
  3. Você usou o WinSCP para copiar o arquivo para sua caixa unix.
  4. O WinSCP pensou: "Isso tem algo que não é texto básico; colocarei uma extensão .bin para indicar dados binários".
  5. A falta __init__.py(agora chamada __init__.py.bin) significa que o python não entende o kit de ferramentas como um pacote.
  6. Você cria __init__.pyno diretório apropriado e tudo funciona ...?
John Fouhy
fonte
50
Além disso, python -c 'import sys; print sys.path 'ajuda - às vezes o usuário coloca os arquivos em um caminho não verificado.
Mikebabcock
1
Estou usando a mesma coisa, exceto que o WinSCP não anexou .bin.
usuário
9
se eu tiver um "__init__.py" vazio, a mesma coisa acontecerá?
Dietbacon
2
OMG, você governa! Esta é a minha história: 1. Você editou init .py no Windows 2. Adicionou um TAB em vez de espaços 3. Você pesquisa muito no Google até encontrar este post! ;)
GBrian
1
Para mim, o problema era que eu estava usando python driver.pyquando deveria estar usando python3 driver.pydesde a instalação pip3.
Eric Wiener
72

Faz

(local directory)/site-packages/toolkit

tem um __init__.py?

Para fazer a importação percorrer seus diretórios, todo diretório deve ter um __init__.pyarquivo.

igorgue
fonte
1
Bom ponto! Observação: Desde o Python 3.3, qualquer diretório no sys.path com um nome que corresponda ao nome do pacote será reconhecido.
PatrickT
1
isso não é necessário apenas para referências de caminho relativo? por que todo diretório deve tê-lo?
Sonic Soul
56

Encontrei algo muito semelhante quando fiz este exercício no LPTHW; Eu nunca consegui o Python reconhecer que eu tinha arquivos no diretório de onde estava ligando. Mas consegui fazê-lo funcionar no final. O que fiz e o que recomendo é tentar o seguinte:

(NOTA: Desde o seu post inicial, suponho que você esteja usando uma máquina baseada em * NIX e executando coisas na linha de comando, portanto, este conselho é adaptado a isso. Desde que eu executo o Ubuntu, foi o que fiz)

1) Altere o diretório (cd) para o diretório acima do diretório onde estão seus arquivos. Nesse caso, você está tentando executar o mountain.pyarquivo e chamando o toolkit.interface.pymódulo, que está em diretórios separados. Nesse caso, você iria para o diretório que contém caminhos para esses dois arquivos (ou seja, o diretório mais próximo que os caminhos desses arquivos compartilham). Qual, neste caso, é o toolkitdiretório

2) Quando você estiver no tookitdiretório, digite esta linha de código na sua linha de comandos:

export PYTHONPATH=.

Isso define o seu PYTHONPATH como ".", O que basicamente significa que o seu PYTHONPATH agora procurará os arquivos chamados no diretório em que você está atualmente (e, mais precisamente, nas ramificações do subdiretório em que você está. Portanto, ele não olha apenas no diretório atual, mas em todos os diretórios que estão no diretório atual).

3) Depois de definir seu PYTHONPATH na etapa acima, execute seu módulo no diretório atual (o toolkitdiretório). O Python agora deve encontrar e carregar os módulos que você especificou.

Espero que isto ajude. Eu fiquei bastante frustrado com isso.

Specterace
fonte
2
Ou no Windows set PYTHONPATH=..
precisa saber é
Isso funcionou para mim. Também simplifiquei COMPLETAMENTE minhas frustrações com PYTHONPATH, pois eu precisava atualizá-lo para um caminho absoluto toda vez que trocava de máquina. Obrigado, obrigado, obrigado.
the_e
41

No * nix, verifique também se PYTHONPATH está configurado corretamente, especialmente se ele possui este formato:

 .:/usr/local/lib/python

(Observe o .:princípio, para que ele também possa pesquisar no diretório atual.)

Também pode estar em outros locais, dependendo da versão:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.
Renaud
fonte
6
Também pode ser .:/usr/lib/python, .:/usr/lib/python2.6, .:/usr/lib/python2.7e etc., dependendo da versão
Nikita Volkov
Para mim, o módulo está em /usr/local/lib/python3.4/dist-packages, mas quando digito python3 no terminal (ubuntu) e tento importá-lo, ele não me permite dizer que não existe. "ImportError: nenhum módulo x existe"
user65165 24/08
Adicionar #!/usr/bin/pythonno final de um arquivo também deve funcionar, certo?
Nearoo 06/11
1
@ Nearoo Eu não acho que isso funcione. Além disso, geralmente esse shebang é adicionado na parte superior de um arquivo.
Renaud
2
No MacOSX, foi corrigido adicionando PYTHONPATH = / usr / local / lib / python2.7 / site-packages aos scripts de inicialização.
Johan Snowgoose
23

Resolvi meu próprio problema e escreverei um resumo das coisas erradas e da solução:

O arquivo precisa ser chamado exatamente __init__.py. Se a extensão for diferente, como no meu caso .py.bin, o Python não poderá se mover pelos diretórios e não poderá encontrar os módulos. Para editar os arquivos, você precisa usar um editor Linux, como vi ou nano . Se você usar um editor do Windows, isso gravará alguns caracteres ocultos.

Outro problema que estava afetando era que eu tinha outra versão do Python instalada pela raiz; portanto, se alguém estiver trabalhando com uma instalação local do python, verifique se a instalação do Python que está executando os programas é o Python local. Para verificar isso, basta fazer which pythone ver se o executável é o que está no seu diretório local. Caso contrário, altere o caminho, mas verifique se o diretório local do Python é anterior ao outro Python.

Eduardo
fonte
Um problema que tive foi que um módulo foi (re) instalado pelo pip apenas com o usuário root para acessá-lo, de modo que o usuário que executou o programa não o viu.
Jānis Elmeris
@ JānisElmeris você pode elaborar mais sobre o comentário acima, acho que também estou enfrentando um erro semelhante. Eu tenho meus __init__.pyarquivos colocados no diretório relevante, mas instalei manualmente um pacote usando setup.py. Como a instalação de um novo pacote interferiu nas importações.
Krishna Oza
@ Darth_coder, desculpe, isso foi há seis anos e eu não me lembro do caso. Além disso, estou lidando com o Python muito pouco, não ultimamente. Pelo que escrevi, posso pensar que instalei um pacote como root, o que alterou as permissões para que outros usuários não tivessem o acesso que tinham antes.
Jānis Elmeris
19

uma solução fácil é instalar o módulo usando, em python -m pip install <library-name>vez de pip install <library-name> você, usar o sudo em caso de restrições de administrador

Badr Bellaj
fonte
2
O que python -malcançar na frente pip install?
Sporc
1
@sporc - quando você usa o sinalizador de linha de comando -m, o Python importa um módulo ou pacote para você e o executa como um script. Quando você não usa o sinalizador -m, o arquivo que você nomeou é executado apenas como um script.
Tony Ciccarone 30/03/19
Não tenho certeza do que esta resposta está tentando dizer que python -m pip...funcionou errado , mas pip...não o fez: elas são efetivamente a mesma coisa, supondo que estejam realmente no mesmo pythondiretório. Possivelmente, a situação observada foi que o pipprograma autônomo não estava disponível em algumas versões mais antigas do python (mas agora está nas versões 2.7 e 3.x). Nesse caso, o pythonestava em um virtualenv local e pipnão estava, por python -m pip installisso instalaria no virtualenv local, enquanto piptentaria instalar no python do sistema (e falharia sem o sudo). De qualquer forma, não faz sentido.
22618 Michael
17

Para marcar um diretório como um pacote, você precisa de um arquivo chamado __init__.py, isso ajuda?

orip
fonte
Eu já tenho um arquivo chamado init .py.bin. Se eu mudar o nome para init .py, recebo este erro: /__init__.py ", linha 1" utilitários "," demo "] ^ SintaxeErro: sintaxe inválida
Eduardo
O que há no init .py? Poste isso como parte da sua pergunta, por favor.
315 S.Lott
Não há nada, está vazio. Foi com o pacote que eu baixei, preciso escrever algo no arquivo ?.
Eduardo
@ S.Lott: você não precisa colocar nada no seu init .py, certo?
igorgue 3/08/08
1
@Eduardo. Seu init .py recebe um erro. E você diz que está vazio. Isso é difícil de conciliar. E não pode ser chamado init .py.bin - o Python ignoraria esse arquivo. Normalmente, não pode ter nada nele.
315 S.Lott
16

Usando PyCharm(parte do conjunto JetBrains), você precisa definir seu diretório de scripts como Origem:
Right Click > Mark Directory as > Sources Root

MonoThreaded
fonte
12

Você está lendo esta resposta e diz que __init__.pyestá no lugar certo, instalou todas as dependências e ainda está recebendo o ImportError.

Eu estava enfrentando um problema semelhante, exceto que meu programa funcionava bem quando executado com PyCharm, mas o erro acima quando eu o executava a partir do terminal. Depois de pesquisar mais, descobri que PYTHONPATHnão havia a entrada para o diretório do projeto. Então, eu defino PYTHONPATHpor instrução Import funciona no PyCharm, mas não no terminal :

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

Há outra maneira de fazer isso usando sys.pathcomo:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

Você pode usar inserir / acrescentar com base na ordem em que deseja que seu projeto seja pesquisado.

avp
fonte
12

Para mim, foi algo realmente estúpido. Eu instalei a biblioteca usando, pip3 installmas estava executando o meu programa python program.pyem oposição a python3 program.py.

kev
fonte
1
Uau ! Isso funcionou para mim também.
JavaDeveloper 24/04
1
Você salvou o meu dia.
Aymen
7

Sim. Você precisa do diretório para conter o __init__.pyarquivo, que é o arquivo que inicializa o pacote. Aqui, dê uma olhada nisso .

Os arquivos __init__.py são necessários para fazer o Python tratar os diretórios como contendo pacotes; isso é feito para impedir que diretórios com um nome comum, como string, ocultem acidentalmente módulos válidos que ocorrem posteriormente no caminho de pesquisa do módulo. No caso mais simples, __init__.py pode ser apenas um arquivo vazio, mas também pode executar o código de inicialização do pacote ou definir a variável __all__, descrita mais adiante.

miya
fonte
6
  1. Você deve ter o arquivo __ init__.py no mesmo diretório em que está o arquivo que está sendo importado.
  2. Você não pode tentar importar um arquivo com o mesmo nome e ser um arquivo de 2 pastas configuradas no PYTHONPATH.

por exemplo: / etc / environment

PYTHONPATH = $ PYTHONPATH: / opt / folder1: / opt / folder2

/ opt / folder1 / foo

/ opt / folder2 / foo

E, se você estiver tentando importar um arquivo foo, o python não saberá qual você deseja.

from foo import ... >>> importadorror: nenhum módulo chamado foo

Iasmini Gomes
fonte
5

Meus dois centavos:

insira a descrição da imagem aqui

Cuspir:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

Isso me deixou confuso - passou por posts e posts sugerindo feios hacks de syspath (como você vê __init__.py, todos os meus estavam lá). Acontece que game / oblivion.py e game / oblivion estavam confundindo python, o que cuspiu o inútil "Nenhum módulo chamado RecordGroups". Eu estaria interessado em uma solução alternativa e / ou links que documentem esse comportamento (mesmo nome) -> EDIT (2017.01.24) - veja E se eu tiver um módulo e um pacote com o mesmo nome? Curiosamente, normalmente os pacotes têm precedência, mas aparentemente nosso lançador viola isso.

EDIT (2015.01.17): não mencionei que usamos um iniciador personalizado dissecado aqui .

Mr_and_Mrs_D
fonte
mais como o caminho está fora. game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py Pode querer corrigir isso com anexando seu código python para uso:game.oblivion.patchers.RecordGroups
Dwight Spencer
@DwightSpencer: Tenho certeza de que importei o "RecordGroups", game.oblivion.__init__.pymas talvez seja necessário verificar isso
Mr_and_Mrs_D
4

Linux: Os módulos importados estão localizados em /usr/local/lib/python2.7/dist-packages

Se você estiver usando um módulo compilado em C, não se esqueça de chmod o arquivo .so depois sudo setup.py install.

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so
KrisWebDev
fonte
3

No meu caso, o problema era que eu estava vinculando ao debug python & boost::Python, o que exige que a extensão seja FooLib_d.pyd, não apenas FooLib.pyd; renomear o arquivo ou atualizar CMakeLists.txtpropriedades corrigiu o erro.

Peter Karasev
fonte
3

Se você tentou todos os métodos fornecidos acima, mas falhou, talvez o seu módulo tenha o mesmo nome que um módulo interno. Ou, um módulo com o mesmo nome existente em uma pasta com alta prioridade sys.pathque a do seu módulo.

Para depurar, diga suas from foo.bar import bazreclamações ImportError: No module named bar. Mudando para import foo; print foo, que mostrará o caminho de foo. É o que você espera?

Caso contrário, renomeie fooou use importações absolutas .

liushuaikobe
fonte
1
Para mim, isso rende ImportError: No module named foo.
alex
3

Meu problema foi que eu adicionei o diretório com o __init__.pyarquivo ao PYTHONPATH, quando na verdade eu precisava adicionar o diretório pai.

Rico
fonte
3

Para todos aqueles que ainda têm esse problema. Acredito que Pycharm se confunde com as importações. Para mim, quando escrevo 'from namespace import something', a linha anterior fica sublinhada em vermelho, sinalizando que há um erro, mas funciona. No entanto, '' de .namespace import something '' não é sublinhado, mas também não funciona.

Tentar

try:
    from namespace import something 
except NameError:
    from .namespace import something
AKJ
fonte
1
A primeira é a sintaxe python 2, o segundo é python 3.
Tanya Branagan
2

Corrigido meu problema escrevendo print (sys.path)e descobrindo que o python estava usando pacotes desatualizados, apesar de uma instalação limpa. A exclusão desses python criados automaticamente usa os pacotes corretos.

limão
fonte
2

No meu caso, porque estou usando PyCharm e PyCharm, crie um 'venv' para cada projeto na pasta do projeto, mas é apenas um mini env de python. Embora você tenha instalado as bibliotecas necessárias no Python, mas no seu projeto personalizado 'venv', ele não está disponível. Esse é o verdadeiro motivo de 'ImportError: nenhum módulo chamado xxxxxx' ocorreu no PyCharm. Para resolver esse problema, você deve adicionar bibliotecas ao ambiente personalizado do projeto seguindo estas etapas:

  • No PyCharm, no menu 'Arquivo' -> Configurações
  • Na caixa de diálogo Configurações, Projeto: XXXProject-> Project Interpreter
  • Clique no botão "Adicionar", ele mostrará a caixa de diálogo "Pacotes disponíveis"
  • Pesquise na sua biblioteca, clique em 'Instalar Pacote'
  • Então, todo o pacote necessário será instalado na sua pasta personalizada 'venv'.

Caixa de diálogo Configurações

Aproveitar.

Yuanhui
fonte
0

Depois de sofrer o mesmo problema, achei que minha resolução era excluir todos os pycarquivos do meu projeto, parece que esses arquivos em cache estavam causando esse erro.

A maneira mais fácil de encontrar isso foi navegar para a pasta do meu projeto no Windows Explorer e procurar *.pyc, selecionando todos ( Ctrl+ A) e excluindo-os ( Ctrl+ X).

É possível que eu possa ter resolvido meus problemas apenas excluindo o pycarquivo específico, mas nunca tentei isso

Sayse
fonte
0

Eu enfrentei o mesmo problema: Import error. Além disso, a biblioteca foi instalada 100% corretamente. A fonte do problema foi que no meu PC 3 a versão do python (pacote anaconda) foi instalada). É por isso que a biblioteca foi instalada não no lugar certo. Depois disso, mudei para a versão adequada do python no meu PyCharm IDE.

Rocketq
fonte
0

Eu tive o mesmo erro. Foi causado por alguém criando uma pasta na mesma pasta do meu script, cujo nome conflitava com um módulo que eu estava importando de outro lugar. Em vez de importar o módulo externo, ele olhou dentro desta pasta que obviamente não continha os módulos esperados.

Toivo Säwén
fonte
0

Eu tive o mesmo problema (Python 2.7 Linux), encontrei a solução e gostaria de compartilhá-la. No meu caso, eu tinha a estrutura abaixo:

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

Em 'main.py', tentei sem êxito todas as combinações abaixo:

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

A solução era muito mais simples do que eu pensava. Renomeei a pasta "Livreto" para "livreto" e é isso. Agora, o Python pode importar a classe Question normalmente usando em 'main.py' o código:

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

A partir disso, posso concluir que nomes de pacotes (pastas) como 'livreto' devem começar com letras minúsculas; caso contrário, o Python o confunde com nomes de classes e nomes de arquivos.

Aparentemente, esse não foi o seu problema, mas a resposta de John Fouhy é muito boa e esse tópico tem quase tudo o que pode causar esse problema. Então, isso é mais uma coisa e espero que talvez isso possa ajudar outras pessoas.

ioaniatr
fonte
0

No meu caso, eu estava incluindo o caminho para a pasta package.egg em vez do pacote real abaixo. Copiei o pacote para o nível superior e funcionou.

Fakrudeen
fonte
0

Isso funcionou para mim: __init__.pyarquivo criado dentro da pasta pai (no seu caso, dentro da site-packagespasta). E importado assim:

from site-packages.toolkit.interface import interface

Espero que seja útil para você também!

Sherzod
fonte
0

No servidor linux, tente dos2unix script_name

(remova todos (se houver) pycarquivos com o comandofind . -name '*.pyc' -delete )

e execute novamente no caso, se você trabalhou no script no Windows

Poli
fonte
0

No meu caso, eu estava usando sys.path.insert()para importar um módulo local e estava obtendo module not foundde uma biblioteca diferente. Eu tive que colocar sys.path.insert()abaixo as importações que relataram module not found. Eu acho que a melhor prática é colocar sys.path.insert()na parte inferior de suas importações.

Michał Zawadzki
fonte