我知道这里有很多类似的问题,但我无法找出最适合我项目的问题。这是一个以下列方式组织的小型数据研究项目:
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。
答案 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)
有几点:
__init__.py
才能使其可导入。 Python 3不需要。src
内部运行的,那么这是导入的基础。每个脚本都需要sys.path.insert(0, '.')
,然后随时拥有from analysis.analysis1 import foo, bar
。https://github.com/pypa/sampleproject
以获取打包脚本的推荐方法,以便可以从PYTHONPATH
分发,安装甚至调用它们。通过运行python -c 'import mypackage
。答案 2 :(得分:0)
我注意到,当您撰写有关配置文件的文章时,您已经写过' config.py'。但是在你的代码中,它似乎是一个.yml文件。
如果您选择使用.py文件,则可以通过以下方式访问:
from src import config