【问题标题】:How to handle "flat" relative imports in python 3.6?如何在 python 3.6 中处理“平面”相对导入?
【发布时间】:2018-02-23 15:10:21
【问题描述】:

既然关于相对进口的问题太多了,我会尽量简短和甜美。是的,我读过“Relative imports for the billionth time”。

我有一个这样的项目结构:

.
├── Makefile
└── src
    ├── __init__.py
    ├── model
    │   └── train_model.py
    └── preprocessing
        └── process.py

例如,我希望能够调用make preprocessingmake train,然后运行process.pytrain_model.py

## Make train
train:
    python3 src/model/train_model.py

例如模块将始终来自 Makefile 所在的顶级项目文件夹。

现在,我的问题是我可能在不同的子模块之间存在依赖关系,例如train_model.pyprocess.py。具体来说,如果我尝试使用from src.preprocessing import processtrain_model 中导入process,我会收到错误ImportError: No module named 'src'。同样,我尝试了from ...preprocessing import process,这给了我另一个错误:SystemError: Parent module '' not loaded, cannot perform relative import

我在train_model.py 的末尾使用了if __name__ == '__main__':,但我似乎无法弄清楚python 是如何使用__name__ 来查找不同的模块的,如果这个f**** 在过程。

【问题讨论】:

    标签: python python-3.x python-import relative-import


    【解决方案1】:

    使用PYTHONPATH。我会这样做:

    生成文件:

    export PYTHONPATH=$(abspath src)
    
    train:
        python3 src/model/train_model.py
    

    train_model.py:

    from preprocessing import process
    

    现在每个导入都将首先查看src。写from src.preprocessing import process 是不习惯的——通常导入被理解为在某个基本目录中(你不想将PYTHONPATH 设置为src 上面的目录,因为它可能包含你不想的东西导入)。

    【讨论】:

    • 嗨,约翰,感谢您的回答。在 makefile 中导出 pythonpath 的第一部分效果很好。但是,导入 from preprocessing import process 不起作用。我只是得到ImportError: No module named 'preprocessing。有什么想法吗?
    • @TMorville:如果你把它放在train_model.py 中,print(sys.path) 会告诉你什么? print(os.environ.get('PYTHONPATH')) 怎么样?
    • print(sys.path) 输出(除其他外)/src/model 而不仅仅是/src/我猜它应该这样做。调用 make train 时,print(os.environ.get('PYTHONPATH')) 的输出为空白。当直接使用python3 src/model/train_model.py 调用时,它是None
    • @TMorville:好的,所以不知何故没有设置环境变量。尝试将PYTHONPATH=src python3 src/model/train_model.py 放入您的 Makefile 中......
    • 添加新路径有效,将'/src python3 src/model/train_model.py' 放入sys.path。我猜PYTHONPATH=src python3 src/model/train_model.py是个错误?如果我只是添加export PYTHONPATH=src,那么project/src 会正确添加到 PYTHONPATH,现在它似乎可以工作了!
    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 2017-06-17
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2017-07-30
    • 2019-01-25
    • 2014-07-12
    相关资源
    最近更新 更多