2015-07-13 106 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,因此蟒蛇不能在sys.path找到folder包。

您應該嘗試將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.joinos.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()