2017-08-03 63 views
0

我已成立了一个项目目录如下:Python 3.6正确的方式在项目目录中导入?

project/ 
    src/ 
     __init__.py 
     data/ 
      __init__.py 
      pull_data.py 
      format_data.py 
      update_data.py 
     model/ 
      __init__.py 
      train.py 
      predict.py 

我会做的主要事情是运行train.pypredict.py这两个更新,然后我的训练数据分别预测。我也希望能够独立运行其他python文件,如果需要的话。

我的问题是,这是一个适当的方式来设置我的项目目录,我该如何导入文件?

蟒蛇文件看起来是这样的:

# update_data.py 
from pull_data import pull_data # how? this is in same directory 
from format_data import format_data # how? this is in same directory 

def update_data(): 
    pull_data() # this is in the same directory 
    format_data() # this is in the same directory 
    # other stuff 

if __name__ == '__main__': 
    update_data() 

# train.py 
from update_data import update_data # how? this is in ../data 

def train(): 
    update_data() 
    # other stuff 

if __name__ == '__main__': 
    train() 

# predict.py 
from update_data import update_data # how? this is in ../data 

def predict(): 
    update_data() 
    # other stuff 

if __name__ == '__main__': 
    predict() 

我也是,我应该从src运行代码的前提下,目录像python model/train.py。我也愿意改进。

+0

您当前的配置是否有效? – wwii

+0

[在python中的绝对导入不工作,相对导入工作](https://stackoverflow.com/questions/45448182/absolute-imports-in-python-not-working-relative-imports-work) –

+0

With current运行'python model/train.py'的配置会导致'ModuleNotFoundError:No module named'update_data''。 – PL3

回答

0

我能得到这样的工作将`update_data.py'更改为

from data.pull_data import pull_data 
from data.format_data import format_data 

train.pypredict.py

from data.update_data import update_data 

然后从src/目录中运行以下任一

python -m model.train 
python -m model.predict 

我不知道这是否是运行的东西最合适的方式,但有用。

-1

你的update_data文件看起来很好。

您可以更新train.py和predict.py如下

# train.py 
import sys 
import os 
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 
from data.update_data import update_data 

def train(): 
    update_data() 
    # other stuff 

if __name__ == '__main__': 
    train() 

你predict.py看起来应该像什么

# predict.py 
import sys 
import os 
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 
from data.update_data import update_data 

def predict(): 
    update_data() 
    # other stuff 

if __name__ == '__main__': 
    predict() 

而是附加模型文件夹或可能在里面两个文件路径将所有文件从一个文件夹导入到另一个文件夹。您可以使用下面的项目结构,你可以在你使用main.py为切入点,以你的脚本或命令src目录

project/ 
src/ 
    __init__.py 
    data/ 
     __init__.py 
     pull_data.py 
     format_data.py 
     update_data.py 
    model/ 
     __init__.py 
     train.py 
     predict.py 
    main.py 

添加main.py。

现在您的文件看起来如下

# train.py 
from data.update_data import update_data 

def train(): 
    update_data() 
    # other stuff 

if __name__ == '__main__': 
    train() 

predict.py

# predict.py 
from data.update_data import update_data 

def predict(): 
    update_data() 
    # other stuff 

if __name__ == '__main__': 
    predict() 

和src/main.py

import sys 
import os 
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 

from model.train import train 
from model.predict import predict 
+0

用你的'python model/train.py'运行''我得到'ModuleNotFoundError:没有名为'data''的模块。 – PL3

+0

你也可以通过在'''train.py'''和'''predict.py'''的顶部添加这些拖拽行来做到这一点' ''import sys import os sys.path.append( os.path.dirname(os.path.dirname(os.path.abspath(__ file __))))'''...这基本上告诉python如果找不到模块名称'data' sys路径 – viveksyngh

+0

用'sys.path'进行密码几乎总是错误的方法 –