【问题标题】:Structuring Python project to allow scripts to import local packages, referencing relative to the project root directory构建 Python 项目以允许脚本导入本地包,引用相对于项目根目录
【发布时间】:2020-06-19 16:20:17
【问题描述】:

我设置了一个 python 项目,其中我的脚本存储在一个文件夹中,我的包和数据存储在其他文件夹中,我正在尝试组织最佳结构和过程,以使这些项目之间的引用更加健壮:

project_dir/
    data/
        raw/
            source_1.csv
            source_2.csv
        processed/
            tidydata.csv
            results.csv
    src/
        scripts/
            clean_raw_data.py
            calc_results.py
        packages/
            import_tools
                tool_a.py
                tool_b.py
            calc_tools
    Makefile

我希望能够通过导入 (./src/packages) 和我的数据 (./data) 可靠地引用我的包 使用./src/scripts 文件夹中我的任何脚本的文件读取和写入操作。

我当前的设置涉及执行以下操作:

导入包(调用函数以导入其他函数似乎是不好的做法):

# clean_raw_data.py
import sys
from pathlib import Path
sys.path.append(str(Path(__file__).parent.parent))
import packages.import_tools as imptool

读写文件:

import pandas as pd
df = pd.read_csv('../../data/raw/source_1.csv')
# operations
df.to_csv('../../data/processed/tidydata.csv')

理想情况下,我希望所有内容都可以从项目文件夹project_dir 中引用 在我的结构中的任何文件或脚本中,这样我就可以执行以下操作:

import src.packages.import_tools as imptool
df = pd.read_csv(f'{ROOT_DIR}/data/raw/source_1.csv')

以某种方式。我认为有一个最佳实践指南来配置事情的行为 以类似的方式,但没有看到任何好的建议。什么是最好的方法 处理这个?

【问题讨论】:

    标签: python python-3.x import directory path


    【解决方案1】:

    在 Python 中,引用数据文件和源代码的机制完全不同。虽然您在打开数据文件时总是需要指定完整路径,但 Python 将使用 sys.path 自动搜索要导入的模块。但是,在所有脚本文件中手动“破解” sys.path 是不好的做法。相反,请使用 pipeditable 模式下安装您的项目:

    pip install --editable path/to/project_dir
    

    但请确保在 project_dir 中有一个最小的 setup.py,其中包含以下内容

    from setuptools import setup
    setup(name='myproject')
    

    pip 会将符号链接 myproject.egg-info 放入您的 site-packages 文件夹中,您可以通过

    进行验证
    pip show myproject
    

    这允许你使用所谓的绝对导入导入你的包,总是从你的 project_dir 开始

    from src.packages.import_tools import tool_a
    

    (请注意,您的 import packages.import_tools as imptool 无论如何都不起作用,因为 import_tools 是一个包而不是模块。)

    接下来您可以添加到 project_dir 的内容是 README.MDrequirements.txttest 用于单元测试的文件夹。请记住,scriptspackages 之间的区别有些人为,因为所有 Python 文件基本上都是可以导入的模块。

    【讨论】:

    • 谢谢!这很有帮助。我以前没有见过 --editable 选项。我很惊讶这个用例在任何地方都没有得到更常见的描述。我花了很长时间在“将所有函数和调用放入某个脚本”和“这里是如何设置一个准备好用于生产的包”之间找到平衡点。中间没多少,我发现了。如果您不使用“--editable”顺便说一句会发生什么?
    猜你喜欢
    • 2021-03-02
    • 2012-08-31
    • 2018-08-08
    • 2020-10-23
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2012-06-21
    相关资源
    最近更新 更多