Python 3.6正确的方式导入项目目录?

时间:2017-08-03 16:52:02

标签: python python-3.x import

我有一个项目目录设置如下:

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文件。

我的问题是,这是设置项目目录的合适方式吗?我应该如何导入文件?

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的{​​{1}}目录运行代码。我也愿意改进这一点。

2 个答案:

答案 0 :(得分: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 :(得分:-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()

不是在模型文件夹中的两个文件中追加路径,也可能是在将某个文件夹从一个文件夹导入另一个文件夹的所有文件中。您可以使用下面的项目结构,您可以在src文件夹中添加main.py

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