在中小型数据科学项目中导入绝对路径

时间:2016-08-05 09:29:58

标签: python makefile

我知道这里有很多类似的问题,但我无法找出最适合我项目的问题。这是一个以下列方式组织的小型数据研究项目:

project-name/
   docs/
   src/
      __init__.py
      config.yml
      Makefile
      data/
      data_management/ 
          __init__.py
          process1.py
          process2/
      analysis/
          __init__.py
          analysis1.py
          analysis2/
      library/
          __init__.py
          config.py

根目录中的Makefile随后会在data_management(准备原始数据)和analysis或其子目录中分别执行多个脚本(因为某些进程有时非常广泛)。 / p>

每个模块都是自包含的 - 除了它们都导入(并因此共享)library目录中的函数/类(我读过,应该避免违反自包含模块的原则但是我不知道怎么解决它而不必复制functinos)。一个例子是config.py中的配置类(管理数据库信息,相关子目录的路径,不同的用户规范等)。

问题:如果我在每个脚本中都有一个绝对导入路径,我觉得最好,即如果我可以在项目的任何地方写import library.config。但是感觉不对

# project-name/src/data_management/process1/data_to_sql.py    
import os
import sys
sys.path.insert(0, os.path.abspath('..'))
import library.config
config = library.config.Configuration()

位于此脚本或任何其他脚本的顶部(因为为了访问我的"路径管理系统",我遇到了指定路径的问题)。

问题:如何避免在任何文件中使用sys.path.insert?我应该避免编辑PYTHONPATH吗?如果没有,我如何在makefile中自动完成此设置(因为,最终,我想与其他人共享此代码)?

谢谢。

编辑:我使用的是Python 2.7.11。

3 个答案:

答案 0 :(得分:3)

您可以在setup.py中创建project-name文件,从而在项目中创建一个包。之后你可以做到

pip install -e project-name/

然后在Python环境中的任何地方都可以执行

import project_name
import project_name.library.config

另外,如果你这样做

from __future__ import absolute_import

您可以执行

之类的导入语句
from ..library import config

基本上导入../library/config.py

答案 1 :(得分:0)

有几点:

  1. 如果这是Python 2.7,则每个目录中必须有__init__.py才能使其可导入。 Python 3不需要。
  2. 由于makefile是从src内部运行的,那么这是导入的基础。每个脚本都需要sys.path.insert(0, '.'),然后随时拥有from analysis.analysis1 import foo, bar
  3. 查看https://github.com/pypa/sampleproject以获取打包脚本的推荐方法,以便可以从PYTHONPATH分发,安装甚至调用它们。通过运行python -c 'import mypackage

答案 2 :(得分:0)

我注意到,当您撰写有关配置文件的文章时,您已经写过' config.py'。但是在你的代码中,它似乎是一个.yml文件。

如果您选择使用.py文件,则可以通过以下方式访问:

from src import config