“ImportError: nenhum módulo chamado” ao tentar executar o script Python


144

Estou tentando executar um script que lança, entre outras coisas, um script python. Eu recebo um ImportError: nenhum módulo chamado ..., no entanto, se eu iniciar o ipython e importar o mesmo módulo da mesma maneira através do interpretador, o módulo será aceito.

O que está acontecendo e como posso corrigi-lo? Eu tentei entender como python usa PYTHONPATH, mas estou completamente confuso. Qualquer ajuda seria muito apreciada.


4
Você precisa dar mais informações. Quando você diz "executar um script", você quer dizer um script de shell? Que módulo é que você não pode importar? Onde esse módulo está localizado? Onde está localizado o seu script?
BrenBarn

2
Se você deseja uma resposta definitiva para "o que está acontecendo", inicie o python com a -vopção e você verá onde o python está (ou não) encontrando os módulos importados.
FatalError

O que você está tentando importar? Os dois scripts python estão no mesmo diretório?
pynovice

2
Informe o código que você está executando, o texto completo do rastreamento da pilha e as etapas exatas que você está executando para produzir o erro. É bastante difícil ajudar quando não sabemos qual é o problema exato.
precisa saber é o seguinte

5
Acho que é um problema que muitos usuários experimentam, mesmo 4 anos após a primeira pergunta.
CodeOcelot

Respostas:


182

Esse problema ocorre devido às maneiras pelas quais o interpretador IPython da linha de comando usa seu caminho atual versus a maneira como um processo separado (seja um notebook IPython, um processo externo, etc.). O IPython procurará módulos a serem importados, encontrados não apenas no sys.path, mas também no diretório de trabalho atual. Ao iniciar um intérprete a partir da linha de comando, o diretório atual em que você está operando é o mesmo em que o ipython foi iniciado. Se você executar

import os
os.getcwd() 

você verá que isso é verdade.

No entanto, digamos que você esteja usando um notebook ipython, execute os.getcwd()e seu diretório de trabalho atual seja a pasta na qual você instruiu o notebook a operar no seu arquivo ipython_notebook_config.py (normalmente usando a c.NotebookManager.notebook_dirconfiguração).

A solução é fornecer ao interpretador python o caminho para o seu módulo. A solução mais simples é anexar esse caminho à sua lista sys.path. No seu notebook, tente primeiro:

import sys
sys.path.append('my/path/to/module/folder')

import module-of-interest

Se isso não funcionar, você tem um problema diferente em suas mãos, não relacionado ao caminho para a importação, e deve fornecer mais informações sobre o seu problema.

A maneira melhor (e mais permanente) de resolver isso é definir o seu PYTHONPATH , que fornece ao intérprete diretórios adicionais para procurar pacotes / módulos python. A edição ou configuração do PYTHONPATH como uma var global depende do sistema operacional e é discutida em detalhes aqui para Unix ou Windows .


1
PSA: se você chegou a esta pergunta do SO porque está recebendo esse erro no notebook jupyter, veja abaixo stackoverflow.com/a/27944947/127971 Infelizmente, a pergunta não é específica o suficiente para uma única resposta.
22717 Michael

@ Michael que a resposta é sobre a importação de módulos Python no caso geral; o arquivo dunder init.py é necessário quando o intérprete procura nos diretórios por módulos a serem importados, portáteis ou não. A resposta acima sobre o diretório de trabalho do intérprete de notebook e a configuração PYTHONPATH está correta.
BoltzmannBrain

Eu disse que haveria várias respostas corretas, devido à redação da pergunta. Não estou sugerindo que esta resposta não esteja correta. Mas se você estiver usando o jupyter-notebook, vai tocar no arquivo __init_.py, certo? ... e não vai querer modificar PYTHONPATHnem ligar sys.path.append, mesmo que eles também estejam corretos (correto?). Quero dizer, eu tenho dezenas de diretórios com código neles, e não vou adicioná-los todos ao caminho - ou esperar outros usuários em seu arquivo de configuração jupyter, mesmo que seja um diretório.
22717 Michael

16

Basta criar um arquivo python vazio com o nome __init__.pyna pasta que mostra erro, enquanto você executa o projeto python.


1
Com ' init.py ' você quer dizer '_ init_ .py', certo? Eu criei o _ init_ .py como um arquivo vazio e funcionou para mim. Muito obrigado. Mas por que isso é necessário? Antes eu tinha um script python no mesmo diretório do meu notebook ipython e a importação estava funcionando bem.
Eduardo Reis

3
Na verdade, init .py é usado para indicar python para indicar que há algum pacote contendo nesse local correspondente. somente ele encontrará submódulos que você criou sob ele. se você não criar ' init .py' significa que o python não sabe que há algum pacote nele. Por exemplo: em "Myfolder.Mypackage import Mymodules" para isso, por exemplo, você deve iniciar init .py para indicar python e dizer que há algum pacote aqui. senão não sabe.
Mohideen bin Mohammed

1
Sim, resposta perfeita. Isso é necessário no python 2.7, mas observe no 3
Agape Gal'lo 8/16

isso corrigiu o problema no python 3 para mim.
Rick suporta Monica

Também corrigi o problema para mim - usando o notebook jupyter, com a fonte python no subdiretório do arquivo ipynb; por exemplo, foo.ipynbusando bar/baz.py, adicione um bar/__init__.pyarquivo vazio para que o notebook possa ser usadofrom bar.baz import MyClass
michael

12

Verifique se eles estão usando o mesmo intérprete. Isso aconteceu comigo no Ubuntu:

$ ipython3 -c 'import sys; print(sys.version)'
3.4.2 (default, Jun 19 2015, 11:34:49) \n[GCC 4.9.1]

$ python3 -c 'import sys; print(sys.version)'
3.3.0 (default, Nov 27 2012, 12:11:06) \n[GCC 4.6.3]

E sys.pathfoi diferente entre os dois intérpretes. Para corrigi-lo, removi o Python 3.3.


tendo usado o miniconda para instalar um monte de coisas relacionadas a python, também obtive exatamente esse problema. O pacote do ubuntu python 2.7 é diferente do miniconda python 2.7. Essa resposta permitiu que eu corrija o problema
Bph

4
Este foi o meu problema. Eu havia atualizado para o python 2.7.11, mas meu shell interativo iPython ainda estava usando o 2.7.5. Eu só precisava correr pip install --upgrade ipythonpara obter a versão mais recente e, em seguida, ele usava o 2.7.11 automaticamente por padrão.
Abundnce10

Meu IPython é 7.4.0 enquanto não existe essa versão do Python.
aderchox

@aderchox Execute isso no ipython para obter a versão do interpretador:import sys; sys.version
z0r

7

O principal motivo é que os sys.paths do Python e do IPython são diferentes.

Por favor, consulte o link lucypark , a solução funciona no meu caso. Isso acontece quando instala o opencv por

conda install opencv

E ocorreu um erro de importação no iPython. Existem três etapas para resolver esse problema:

import cv2
ImportError: ...

1. Verifique o caminho no Python e no iPython com o seguinte comando

import sys
sys.path

Você encontrará resultados diferentes do Python e Jupyter. Segundo passo, use apenas sys.path.append para corrigir o caminho perdido por tentativa e erro.

2. Solução temporária

No iPython:

import sys
sys.path.append('/home/osboxes/miniconda2/lib/python2.7/site-packages')
import cv2

o ImportError:..problema resolvido

3. Solução permanente

Crie um perfil iPython e defina o acréscimo inicial:

No shell bash:

ipython profile create
... CHECK the path prompted , and edit the prompted config file like my case
vi /home/osboxes/.ipython/profile_default/ipython_kernel_config.py

No vi, acrescente ao arquivo:

c.InteractiveShellApp.exec_lines = [
 'import sys; sys.path.append("/home/osboxes/miniconda2/lib/python2.7/site-packages")'
]

FEITO


'ipython profile create' .... Sim! Esta é a única solução (permanente) que aborda o notebook jupyter que não lê do ambiente PATH e PYTHONPATH ... sem recorrer a instruções sys.path confusas no início de cada arquivo (yuk). obrigado @jesse.
JohnL_10 26/03

6

A ação sys.path.append('my-path-to-module-folder')funcionará, mas para evitar ter que fazer isso no IPython toda vez que você quiser usar o módulo, você pode adicionar export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"ao seu ~/.bash_profilearquivo.


2

Antes de instalar o ipython, instalei os módulos através do easy_install; dizer sudo easy_install mechanize.

Depois de instalar o ipython, tive que executar novamente o easy_install para que o ipython reconhecesse os módulos.


2

Tive um problema semelhante, corrigi- lo chamando em python3vez de python, meus módulos estavam em Python3.5.


2

Se você o estiver executando na linha de comando, às vezes o intérprete python não está ciente do caminho onde procurar por módulos.

Abaixo está a estrutura de diretórios do meu projeto:

/project/apps/..
/project/tests/..

Eu estava executando o comando abaixo:

>> cd project

>> python tests/my_test.py

Depois de executar o comando acima, obtive o erro abaixo

no module named lib

lib foi importado em my_test.py

imprimi sys.path e descobri que o caminho do projeto em que estou trabalhando não está disponível na lista sys.path

eu adicionei o código abaixo no início do meu script my_test.py.

import sys
import os

module_path = os.path.abspath(os.getcwd())    

if module_path not in sys.path:       

    sys.path.append(module_path)

Não tenho certeza se é uma boa maneira de resolvê-lo, mas sim funcionou para mim.


Isso funcionará se você sempre executar o script no mesmo local. Caso contrário, você terá problemas, já que os.getcwd()obtém o diretório em que o script foi executado, não o diretório em que o arquivo de script está.
Nathan Arthur

1

Foi assim que eu consertei:

import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
    sys.path.append(module_path)


0

Encontrei outra fonte dessa discrepância:

Eu tenho o ipython instalado localmente e geralmente em virtualenvs. Meu problema era que, dentro de um virtualenv recém-criado com ipython, o ipython do sistema foi escolhido, que era uma versão diferente do python e ipython no virtualenv (um 2.7.x vs. 3.5.x), e a hilaridade se seguiu.

Eu acho que a coisa mais inteligente a fazer sempre que instalar algo que terá um binário yourvirtualenv/biné executar imediatamente rehashou semelhante para qualquer shell que você esteja usando, para que o python / ipython correto seja captado. (Preciso verificar se existem pipganchos adequados para pós-instalação ...)


0

Solução sem script:

  1. Abra o Spyder -> Ferramentas -> Gerenciador de PYTHONPATH
  2. Adicione caminhos Python clicando em "Adicionar caminho". Por exemplo: 'C: \ Usuários \ Usuário \ AppData \ Local \ Programas \ Python \ Python37 \ Lib \ site-packages'
  3. Clique em "Sincronizar ..." para permitir que outros programas (por exemplo, Jupyter Notebook) usem os pythonpaths definidos na etapa 2.
  4. Reinicie o Jupyter se estiver aberto

0

Provavelmente, isso é causado por diferentes versões do python instaladas no seu sistema , por exemplo , python2 ou python3 .

Execute o comando $ pip --versione $ pip3 --versionverifique de qual pip é o Python 3x . Por exemplo, você deve ver as informações da versão como abaixo:

pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

Em seguida, execute o example.pyscript com o comando abaixo

$ python3 example.py

0

Aconteceu comigo com o diretório utils. Eu estava tentando importar este diretório como:

from utils import somefile

utilsjá é um pacote em python. Apenas mude o nome do diretório para algo diferente e deve funcionar bem.


0

Esse tipo de erro ocorre provavelmente devido a conflitos de versão do python. Por exemplo, se seu aplicativo é executado apenas no python 3 e você também possui o python 2, é melhor especificar qual versão usar. Por exemplo, use

python3 .....

ao invés de

python

0

Esta resposta se aplica a esta pergunta se

  1. Você não quer mudar seu código
  2. Você não deseja alterar o PYTHONPATH permanentemente

Modificar temporariamente PYTHONPATH

o caminho abaixo pode ser relativo

PYTHONPATH=/path/to/dir python script.py

0

import sys sys.path.append ('/ Usuários / {usuário} /Library/Python/3.7/lib/python/site-packages')


-1

Remova pathlibe reinstale-o. Exclua o pathlib na sitepackagespasta e reinstale o pacote pathlib usando o comando pip:

pip install pathlib
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.