我设置了一个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.py在PROJECT_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.MD,requirements.txt和用于单元测试的测试文件夹。并且请记住,脚本和程序包之间的区别有些人为,因为所有Python文件基本上都是可以导入的模块。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句