2015-07-13 3 views
0

У меня есть небольшое приложение на Python3, но оно не будет запущено из-за того, что модуль не найден. Я добавил __init__.py для всех папок уже, но он не работает. Мне интересно, почему.Makefile не может найти модуль в Python3

Вот моя структура

my_project 
    |- __init__.py 
    | 
    |-- folder 
     |-code.py 
     |- __init__.py 
    | 
    |-- Makefile 
    |-- scripts 
     |- import_data.py 

Вот мой Makefile

test: 
    py.test tests/*.py 

create_graph: 
    python scripts/import_data.py 

А вот мой import_data.py

from folder.code import method 

import csv 

method() 
# doing something here 

Когда я бегу make create_graph Это дает мне это.

python scripts/import_data.py 
Traceback (most recent call last): 
    File "scripts/import_data.py", line 1, in <module> 
    from folder.code import method 
ImportError: No module named 'folder' 
make: *** [create_graph] Error 1 

ответ

1

Когда import_data.py скрипт запускается, то sys.path имеет my_project/scripts в нем, но не my_project, следовательно, питон не смог найти folder пакет в sys.path.

Вы должны попробовать добавить папку my_project в переменную PYTHONPATH, это позволит вам получить доступ к folder.code из любого места. Пример BASH -

export PYTHONPATH=<path/to/my_project>:$PYTHONPATH 

Если вы не можете сделать такие изменения переменных окружения, а затем программно, прежде чем пытаться импортировать folder.code, вы можете добавить папку my_project в sys.path переменной. Для этого вы можете использовать __file__, чтобы получить имя файла сценария, а затем получить имя каталога, из этого с помощью os.path.dirname(), а затем получить его родителя с помощью os.path.join и os.path.abspath Примера вашего import_data.py может выглядеть -

import sys 
import os.path 
parent = os.path.abspath(os.path.join(os.path.dirname(__file__),'..')) #this should give you absolute location of my_project folder. 
sys.path.append(parent) 
from folder.code import method 
import csv 

method() 
Смежные вопросы