Qual é a maneira correta de corrigir esse erro ImportError?
Tenho a seguinte estrutura de diretório:
/home/bodacydo
/home/bodacydo/work
/home/bodacydo/work/project
/home/bodacydo/work/project/programs
/home/bodacydo/work/project/foo
E eu estou no diretório
/home/bodacydo/work/project
Agora se eu digitar
python ./programs/my_python_program.py
Eu imediatamente recebo
ImportError: No module named foo.tasks
O ./programs/my_python_program.py
contém a seguinte linha:
from foo.tasks import my_function
Não consigo entender por que o python não encontra ./foo/tasks.py
- está lá.
Se eu fizer isso a partir do shell Python, funcionará:
python
>>> from foo.tasks import my_function
Só não funciona se eu chamar via python ./programs/my_python_program.py
script.
__init__.py
apenas indica que o diretório deve ser tratado como um pacote, quando seu pai está dentrosys.path
ou é um pacote.export PYTHONPATH=`pwd`
/home/bodacydo/work
... veja esta respostaVocê tem um arquivo chamado
__init__.py
no diretório foo? Do contrário, o python não reconhecerá foo como um pacote python.Consulte a seção sobre pacotes no tutorial de python para obter mais informações.
fonte
__init__.py
. O problema desta vez era com$PYTHONPATH
. A solução de Ignacio funcionou.Aqui está uma solução passo a passo:
Adicionar um script chamado
run.py
em/home/bodacydo/work/project
e editá-lo como este:(substitua
main()
pelo método equivalente emmy_python_program
.)/home/bodacydo/work/project
run.py
Explicação: Como python anexa a PYTHONPATH o caminho do script a partir do qual é executado , a execução
run.py
irá anexar/home/bodacydo/work/project
. E voilà ,import foo.tasks
será encontrado.fonte
Solução de exemplo para adicionar a biblioteca ao seu PYTHONPATH.
Adicione a seguinte linha em seu ~ / .bashrc ou apenas execute-a diretamente:
Em seguida, vincule a biblioteca necessária à pasta ~ / .python, por exemplo
fonte
Uma solução melhor do que definir
PYTHONPATH
é usarpython -m module.path
Isso será definido corretamente
sys.path[0]
e é uma maneira mais confiável de executar módulos.Eu tenho uma rápida redação sobre este problema, como outros respondentes mencionaram, o motivo para isso é
python path/to/file.py
colocarpath/to
no início dePYTHONPATH
(sys.path
).fonte
Em minha mente, devo considerar que a
foo
pasta é uma biblioteca independente. Talvez eu queira movê-lo para aLib\site-packages
pasta dentro de uma instalação do Python. Talvez eu queira adicionar umfoo.pth
arquivo lá.Eu sei que é uma biblioteca, pois
./programs/my_python_program.py
contém a seguinte linha:Portanto, não importa que
./programs
seja uma pasta irmã para./foo
. É o fato de quemy_python_program.py
é executado como um script assim:fonte
Se você tiver esse problema ao usar uma versão instalada, ao usar
setup.py
, certifique-se de que seu módulo está incluído dentropackages
fonte