Python não consegue encontrar módulo na mesma pasta

103

Meu python de alguma forma não consegue encontrar nenhum módulo no mesmo diretório. O que estou fazendo errado? (python2.7)

Portanto, tenho um diretório '2014_07_13_test', com dois arquivos nele:

  1. test.py
  2. ola.py

onde hello.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

def hello1():
    print 'HelloWorld!'

e test.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

from hello import hello1

hello1()

Ainda python me dá

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 4, in <module>
ImportError: No module named hello

O que há de errado?

Philipp_Kats
fonte
2
Como você está executando o script? Também qual é a saída deimport sys; sys.path
Salem
1
Experimente>>> import test
martineau
@Casy_fill Você executa seu programa a partir do diretório, onde estão os arquivos presentes? Para importação, não importa se os arquivos importados e importados compartilham um diretório. O importante é que o seu interpretador Python tenha o diretório atual definido corretamente.
Jan Vlcinsky

Respostas:

85

Seu código está bom, suspeito que seu problema seja como você o está iniciando.

Você precisa iniciar o python de seu diretório '2014_07_13_test'.

Abra um prompt de comando e 'cd' em seu diretório '2014_07_13_test'.

Por exemplo:

$ cd /path/to/2014_07_13_test
$ python test.py

Se você não puder 'cd' no diretório como este, você pode adicioná-lo ao sys.path

Em test.py:

import sys, os
sys.path.append('/path/to/2014_07_13_test')

Ou defina / edite o PYTHONPATH

E tudo deve ficar bem ...

... bem, há um pequeno erro com suas linhas 'shebang' (a primeira linha em ambos os arquivos), não deve haver um espaço entre o '#' e o '!'

Há um shebang melhor que você deve usar.

Além disso, você não precisa da linha shebang em todos os arquivos ... apenas aqueles que você pretende executar a partir do seu shell como arquivos executáveis.

Jeremy Allen
fonte
muito obrigado, esse é o problema! Infelizmente, SublimeRepl (que eu uso) não suporta a inicialização de python a partir da pasta agora, então parece que preciso exportar PATH agora
Philipp_Kats
Leitores posteriores, por favor, leiam até o final da página para ver outras respostas muito úteis, por exemplo, aquela de jfn sobre importações relativas .
HongboZhu
Sim, esse era o meu problema. Eu tinha uma grande pasta de projetos de prática Python abertos no VS Code e estava tendo grandes problemas em encontrar coisas no mesmo diretório. Meu problema era que, no terminal, eu não tinha mudado os diretórios para o subdiretório onde estava meu projeto atual. Depois de fazer isso, o problema foi resolvido.
Matt West
109

Altere sua importação em test.py para:

from .hello import hello1
jfn
fonte
24
Se alguém descobrir isso mais tarde, isso é chamado de importações relativas e foi adicionado ao python 2.5: docs.python.org/2.5/whatsnew/pep-328.html
sgfit
10
Para importar todo o módulo usefrom . import hello
ST7
Acho que é uma solução melhor do que a resposta mais aceita. Eu uso toda a importação do módulo, como ST7 apontou:from . import local_module
Gene M
27

Eu tive um problema semelhante, resolvi adicionando explicitamente o diretório do arquivo à lista de caminhos:

import os
import sys

file_dir = os.path.dirname(__file__)
sys.path.append(file_dir)

Depois disso, não tive problemas para importar do mesmo diretório.

ecotner
fonte
2
Enquanto isso funcionava, a resposta de jwn usando importações relativas era uma solução muito mais limpa.
Russ Schultz
19

Aqui está a solução genérica que uso. Resolve o problema de importação de módulos na mesma pasta:

import os.path
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

Coloque isso no topo do módulo, o que dará o erro "Nenhum módulo chamado xxxx"

Apadana
fonte
1
Isso me ajudou a carregar o módulo do diretório pai, substituindo ".." por "../ ..". Muito obrigado!
Nikola R.
1
é o nome do arquivo a ser importado ou módulo atual onde estamos importando o módulo ou é constante
Manoj
12

No meu caso, Python não foi capaz de encontrá-lo porque coloquei o código dentro de um módulo com hifens, por exemplo my-module. Quando mudei para my_moduleele funcionou.

Chris Claxton
fonte
1

Eu encontrei esse problema. Eu tinha três pastas no mesmo diretório, então tive que especificar qual pasta. Ex: script de importação de pasta

Nippon87
fonte
0

O seguinte não resolve o problema do OP, mas o título e o erro são exatamente o que eu encontrei.

Se o seu projeto tiver um setup.pyscript, você pode instalar o pacote em que está, com python3 -m pip install -e .ou python3 setup.py installou python3 setup.py develop, e este pacote será instalado, mas ainda editável (portanto, as alterações no código serão vistas ao importar o pacote). Se não tiver um setup.py, faça sentido .

De qualquer forma, o problema que o OP enfrenta parece não existir mais?

arquivo one.py:

def function():
    print("output")

arquivo two.py:

#!/usr/bin/env python3

import one
one.function()
chmod +x two.py # To allow execution of the python file
./two.py # Only works if you have a python shebang

Command line output: output

Outras soluções parecem 'sujas'

No caso do OP com 2 arquivos de teste, modificá-los para funcionar provavelmente é adequado. No entanto, em outros cenários reais, os métodos listados nas outras respostas provavelmente não são recomendados. Eles exigem que você modifique o código python ou restrinja sua flexibilidade (executando o arquivo python de um diretório específico) e geralmente introduzem aborrecimentos. E se você acabou de clonar um projeto e isso acontece? Provavelmente já funciona para outras pessoas e fazer alterações no código é desnecessário. A resposta escolhida também quer que as pessoas executem um script de uma pasta específica para fazê-lo funcionar. Isso pode ser uma fonte de aborrecimento de longo prazo, o que nunca é bom. Ele também sugere adicionar sua pasta python específica ao PATH (pode ser feito por meio de python ou linha de comando). Novamente, o que acontece se você renomear ou mover a pasta em alguns meses? Você tem que caçar esta página novamente, e, eventualmente, descobrir que você precisa definir o caminho (e que você fez exatamente isso há alguns meses), e que você simplesmente precisa atualizar um caminho (claro, você pode usar sys.path e defini-lo programaticamente, mas isso ainda pode ser instável ) Muitas fontes de grande aborrecimento.

Ben Butterworth
fonte
0

Se você tiver certeza de que todos os módulos, arquivos que você está tentando importar estão na mesma pasta e devem ser selecionados diretamente apenas fornecendo o nome e não o caminho de referência, então seu editor ou terminal deve ter aberto a pasta principal onde todos os arquivos / módulos estão presentes.

Ou tente executar do Terminal, certifique-se primeiro de ir para o diretório correto.

CD path to the root folder where all the modules are

Pitão script.py

Ou se estiver executando [F5] no editor, ou seja, VsCode, abra a pasta completa lá e não os arquivos individuais.

Iqra.
fonte