构建Python项目以允许脚本导入相对于项目根目录的本地包

帐篷

我设置了一个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会使用sys.path来自主搜索要导入的模块。但是,在所有脚本文件中手动“破解” sys.path都是不好的做法。而是使用pip可编辑模式安装项目

pip install --editable path/to/project_dir

但要确保有一个最小的setup.pyPROJECT_DIR包含以下内容

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

pip会将symlink 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.txt用于单元测试测试文件夹。并且请记住,脚本程序包之间的区别有些人为,因为所有Python文件基本上都是可以导入的模块。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

通过Python访问项目根目录

尝试了相对于顶级包的相对导入

相对于Node.JS中的应用程序根目录引用文件的正确方法

如何相对于当前项目文件夹设置http.Dir(..)的目录路径

如何获取相对于导入包路径的文件路径?

Android Studio项目结构(相对于Eclipse项目结构)

如何在Play Framework 2.4中使用相对于项目根目录的路径到H2数据库文件配置?

在Webpack中建立相对于项目根目录的绝对路径

如何获取当前目录相对于git存储库根目录的路径?

clojure-相对于项目提取文件

在水平RecyclerView上相对于中心设置项目Alpha

Python-是否相对于其当前目录打包?

在setup.py构建中包括项目根目录中的python文件

返回相对于站点根目录而不是服务器根目录的路径

Pylint错误:尝试了相对于顶级包的相对导入

导入python类,相对于哪里?

如何导入相对于项目的spring.xml资源?

RelativeLayout-相对于彼此对齐项目中心

当前PHP脚本相对于文档根目录的路径

获取相对于QTreeWidget上的项目的放置位置

Android ConstraintLayout 相对于右侧项目的宽度

在相对于主脚本的目录中调用脚本

Sublime Text 相对于项目目录打开

相对于 ASP.NET 中的根目录

在 Powershell 中相对于当前位置移动项目

在虚幻引擎编辑器中,如何指定相对于项目文件夹根目录的路径?

Python请求相对于脚本目录的目录

如何从项目根目录导入模块?

git status 的 Git 别名列出了相对于存储库根目录的文件