Erro PyCharm: 'No Module' ao tentar importar o próprio módulo (script python)


160

Eu escrevi um módulo (um arquivo my_mod.pyque reside na pasta my_module). Atualmente, estou trabalhando no arquivo cool_script.pyque reside na pasta cur_proj. Abri a pasta no PyCharm usando o File - open (e presumo, portanto, que seja um projeto do PyCharm).

No ProjectView (CMD-7), posso ver meu projeto cur_proj(em vermelho) e, em "Bibliotecas externas", vejo my_module. Em cool_script.py, eu posso escrever

from my_module import my_mod as mm

e PyCharm até faz sugestões para o my_mod. Por enquanto, tudo bem.

No entanto, quando tento executar o cool_script.py, o PyCharm me diz "Nenhum módulo chamado my_module"

Isso me parece estranho, porque

A) no terminal (OS 10.10.2), em python, posso importar o módulo sem problemas - há uma entrada correspondente no PYTHONPATH em .bashrc

B) em PyCharm - Configurações - Projeto cur_proj - Intérprete de projeto - CogWheel ao lado do interpretador python - mais - mostra caminhos para o ícone selecionado do intérprete, os caminhos do PYTHONPATH aparecem (como eu acho que deveriam)

Portanto, por que recebo o erro quando tento executar o cool_script.py? - O que estou perdendo?

Notas:

Adenda 2015-fev-25

Quando vou no PyCharm para Executar - Editar configurações, no meu projeto atual, há duas opções selecionadas com uma marca de seleção: " Adicionar raízes de conteúdo ao PYTHONPATH " e " Adicionar raízes de origem ao PYTHONPATH ". Quando desmarquei os dois, posso carregar meu módulo.

Então funciona agora - mas por quê ?

Outras perguntas surgiram:

  • O que são "raízes de conteúdo" e o que são "raízes de origem"? E por que adicionar algo ao PYTHONPATH faz com que ele se rompa?
  • devo desmarcar essas duas opções o tempo todo (também nos padrões, não apenas nas configurações específicas do projeto (painel esquerdo da caixa de diálogo Configurações de execução / depuração)?

2
Você já deve ter tentado isso, mas ao importar módulos de outros pacotes, inclua packagename from foldername.mymodule import mymethod. Outra coisa que tive que fazer é adicionar a pasta _init .py vazia em todas as pastas que você usaria para acessar o módulo, para o caso de from parentfolder.childfolder.mymodule ...você precisar do init em duas pastas. Dependendo de onde as pastas estão localizadas uma em relação à outra, talvez seja necessário que você tenha um pacote de nível superior, sys.pathconforme descrito nesta resposta
ziddarth

4
Eu também tive seu problema. A seguinte postagem resolveu meus problemas: stackoverflow.com/questions/21236824/…
user3155053

Você identificou por que desmarcar essas caixas de seleção realmente funciona em vez de marcá-las?
Nithish Inpursuit Ofhappiness

O que funcionou para mim é desmarcar Enable Django Supportas configurações Languages & Frameworks -> Djangona versão Pro do PyCharm. Estava abrindo um console django que causou problemas de importação.
Eric Blum

Respostas:


324

Se o seu próprio módulo estiver no mesmo caminho, você precisará marcar o caminho como Sources Root. No explorador de projetos, clique com o botão direito do mouse no diretório que você deseja importar. Depois selecione Mark Directory Ase selecione Sources Root.

Eu espero que isso ajude.


9
Isso funcionou para mim, mas eu também tive que excluir e recriar a configuração de execução que eu havia criado anteriormente antes de marcar a pasta como raiz de origem.
grinch

2
E precisa adicionar __init__.pypara que Python trate os diretórios como contendo pacotes: stackoverflow.com/questions/448271/...
Beatriz Fonseca

Como você faria isso se não estivesse usando o pycharm? Estou enfrentando exatamente o mesmo problema.
Boudewijn Aasman

@BeatrizFonseca Sim, eu fiz. Não consegui fazê-lo funcionar em sublime, mas instalei o pycharm e tentei a resposta aqui, e ela funcionou perfeitamente bem; portanto, deve ter algo a ver com a especificação do diretório correto como o pacote raiz.
Boudewijn Aasman

@BoudewijnAasman você poderia tentar o uso .antes de nome do pacote para especificar que este pacote é uma locais
Beatriz Fonseca

37

Então, se você for para

-> Configuração -> Projeto: Meu_projeto -> Estrutura do projeto,

Apenas o diretório em que o código-fonte está disponível e marque-o como "Fontes" (você pode vê-lo na mesma janela). O diretório com código fonte deve ficar azul. Agora você pode importar em módulos que residem no mesmo diretório.


3
Sei que este é um post antigo, mas funcionou para mim, obrigado.
Mike - SMT

1
A mesma resposta foi encontrada e ignorada muitas vezes, desta vez tentada e funciona!
A.Ametov 29/03

29

Comunidade PyCharm / Profissional 2018.2.1

Eu estava tendo esse problema agora e consegui resolvê-lo da mesma maneira que @Beatriz Fonseca e @Julie apontaram.

Se você for para File-> Settings-> Project: YourProjectName-> Project Structure, terá um layout de diretório do projeto em que está trabalhando atualmente. Você precisará examinar seus diretórios e rotulá-los como sendo o Sourcediretório de todos os seus arquivos de origem ou como uma Resourcepasta para arquivos estritamente para importação.

Você também deve certificar-se de colocar os __init__.pyarquivos nos diretórios de recursos ou em qualquer lugar a partir do qual deseja importar, e funcionará perfeitamente.

Espero que esta resposta ajude alguém, e espero que o JetBrains conserte esse bug irritante.


2
Isso não é específico do PyCharm Professional , mas esse recurso também está disponível na edição da comunidade PyCharm . Na Estrutura do projeto, clique com o botão direito do mouse no diretório que contém o módulo, selecione Mark Directory asno menu de contexto e selecione Sources Root.
Astitva Srivastava 19/09/18

1
Você pode aconselhar o significado desta raiz de fontes. Embora tenha resolvido o meu problema, mas não entendi bem por que estou fazendo isso.
user3341078

8

O que eu tentei é fonte do local onde meus arquivos estão.

por exemplo E:\git_projects\My_project\__init__.py is my location.

Fui para Arquivo -> Configuração -> Projeto: Meu_projeto -> Estrutura do projeto e adicionei a raiz do conteúdo ao local da menção E:\git_projects\My_project

funcionou para mim.


2
A fonte da pasta na Estrutura do projeto funcionou para mim. THX.
Microos 27/01

Obrigado @Virendra Patel e @Microos. Meu projeto pycharm está em /home/my_user/git_projects/this_git_project/this_pycharm_project/. Eu adicionei /home/my_user/git_projects/this_git_project/como raiz de conteúdo e /home/my_user/git_projects/this_git_project/this_pycharm_project/como a única pasta de origem e tudo funcionou finalmente.
KLaz 03/07/19

3

my_moduleé uma pasta, não um módulo e você não pode importar uma pasta, tente ir my_mod.pypara a mesma pasta que o cool_script.pye, em seguida, faça import my_mod as mm. Isso ocorre porque o python apenas procura no diretório atual e sys.path, portanto, não será encontrado, a my_mod.pymenos que esteja no mesmo diretório

Ou você pode procurar aqui uma resposta dizendo como importar de outros diretórios.

Quanto às suas outras perguntas, eu não sei, pois não uso o PyCharm.


Você pode criar uma inicialização .py em uma pasta, interpretador Python vai ler como o pacote python: mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html
Beatriz Fonseca

3

Eu estava recebendo o erro com "Adicionar raízes de origem ao PYTHONPATH" também. Meu problema era que eu tinha duas pastas com o mesmo nome, como project/subproject1/thing/srce project/subproject2/thing/srce eu tive ambos marcado como raiz fonte. Quando renomeei uma das "thing"pastas para "thing1"(qualquer nome exclusivo), funcionou.

Talvez se o PyCharm adicione automaticamente as raízes de origem selecionadas, ele não use o caminho completo e, portanto, misture pastas com o mesmo nome.


2

Isso pode ser causado quando o intérprete Python não consegue encontrar seu código. Você precisa mencionar explicitamente o Python para encontrar seu código nesse local.

Para fazer isso:

  • Vá para o seu console python
  • Adicione sys.path.extend(['your module location'])ao console do Python.

No seu caso:

  • Vá para o seu console python,
  • No início, escreva o seguinte código:

    import sys
    sys.path.extend([my module URI location])
  • Depois de escrever esta declaração, você pode executar o seguinte comando:

    from mymodule import functions

Um pouco feio para adicionar o caminho assim, mas funcionou para mim.
Florian Blume

isso deve ser feito pelo pycharm; automaticamente, ao abrir um console, ele deve incluir comandos sys.path.extend para os diretórios, incluindo dependências (outros projetos) e os diretórios que contêm o código-fonte do presente projeto. MAS NÃO O FAZ automaticamente
fabiob

2

A principal etapa confusa que deve ser feita é recriar a configuração de execução do arquivo de origem que você está tentando executar, para que o IDE escolha os novos caminhos.

A maneira que realmente funcionou para mim foi ir para Executar / editar configurações ..., selecione a configuração do arquivo que você está tentando executar no lado esquerdo, desmarque a caixa "Adicionar raízes de origem ao PYTHONPATH", salve, e depois volte e marque a caixa e salve. ENTÃO funcionaria.


Surpreendentemente, era disso que eu precisava, apesar de fazer Invalidate Cache/Restartduas vezes!
21719 Josh Friedlander

1

Raízes de conteúdo são pastas contendo o código do projeto, enquanto as raízes de origem também são definidas da mesma forma. A única diferença que entendi foi que o código nas raízes de origem é criado antes do código na raiz de conteúdo.

Desmarcá-los não afetaria o tempo de execução até o ponto em que você não está criando módulos separados no seu pacote que são conectados manualmente ao Django. Isso significa que se algum dos seus arquivos não contiver o 'from django import ...' ou qualquer uma das funções não for chamada via django, desmarcar essas duas opções resultará em mau funcionamento.

Atualização - o problema só surge ao usar o Virtual Environmanet e apenas ao controlar o projeto através do terminal fornecido. Porque o terminal ainda funciona através do pyhtonpath do sistema padrão e não do ambiente virtual. enquanto o painel de controle python django funciona bem.


1

A solução para esse problema sem precisar marcar o diretório como raiz de origem é editar configurações de execução e, em execução, selecione a opção "Redirecionar entrada de" e escolha o script que deseja executar. Isso funciona porque é então tratado como se o script tivesse sido executado interativamente nesse diretório. No entanto, o Python ainda marcará o nome do módulo com o erro "nenhum módulo chamado x":

Redirecionar entrada de:

Quando o intérprete executa a instrução de importação, ele procura x.py em uma lista de diretórios montados nas seguintes fontes:

  1. O diretório a partir do qual o script de entrada foi executado ou o diretório atual, se o intérprete estiver sendo executado interativamente
  2. A lista de diretórios contidos na variável de ambiente PYTHONPATH, se estiver configurada.
  3. Uma lista de diretórios dependentes da instalação configurada no momento em que o Python é instalado, no meu caso, usr / lib / python3.6 no Ubuntu.

0

Pycharm 2017.1.1

  1. Clique em View->ToolBar&View->Tool Buttons
  2. No painel esquerdo Projectseria visível, clique com o botão direito do mouse e pressione Autoscroll to source e, em seguida, execute seu código.

Isso funcionou para mim.


0

ln -s. someProject

Se você tiver someDirectory / someProjectDir e dois arquivos, file1.py e file2.py e file1.py tentarão importar com esta linha

de algum arquivo de importação do ProjectPro2

Ele não funcionará, mesmo que você tenha designado o someProjectDir como um diretório de origem e mesmo que seja exibido nas preferências, projeto, menu da estrutura do projeto como raiz do conteúdo. A única maneira de funcionar é vinculando o projeto como mostrado acima (comando unix, funciona no mac, não tem certeza do uso ou sintaxe do Windows). Parece haver algum mecanismo em que o Pycharm faz isso automaticamente no checkout do controle de versão ou na adição como raiz de contexto, pois o link flexível foi criado pelo Pycharm em um projeto dependente. Portanto, basta copiar o mesmo, embora a estranha replicação de diretório seja irritante e a necessidade seja desconcertante. Também na dependência em que criado automaticamente, ele não aparece como novo diretório sob controle de versão. Talvez a comparação dos arquivos .idea revele mais.


-1

A resposta que funcionou para mim foi o que o OP menciona na atualização de 2015: desmarque essas duas caixas na configuração de execução do Python:

  • "Adicionar raízes de conteúdo ao PYTHONPATH"
  • "Adicionar raízes de origem ao PYTHONPATH"

Eu já tinha a configuração de execução definida para usar o venv adequado, portanto, o PyCharm não fazia nenhum trabalho adicional para adicionar coisas ao caminho. Em vez disso, estava causando erros.

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.