如何在GCP Dataflow(Apache Beam)包中添加JSON文件并在代码内调用
问题核心原因
你配置的data_files参数不会将文件打包到Python包的安装目录下:data_files的目标相对路径默认相对于Python安装前缀(如/usr/local/),而非site-packages/下的你的包目录,这是配置不生效的核心原因。你需要使用package_data参数完成包内资源文件的打包。
解决步骤
确认common包合法性
确保common目录下存在空的__init__.py文件,保证该目录被识别为Python包,能被setuptools.find_packages()正确扫描到。修正setup.py配置
删除原有的data_files配置,新增package_data参数指定需要打包的包内资源,修改后的配置如下:
import setuptools setuptools.setup( packages=setuptools.find_packages(), package_data={ # 指定common包下所有json文件都要被打包 "common": ["*.json"] }, include_package_data=True, install_requires=[ 'apache-beam[gcp]==2.31.0', 'python-dateutil==2.8.1' ], )
统一JSON文件存放位置
删除根目录下的mapping.json,仅在common目录下保留该文件,避免路径冲突。原有MANIFEST.in的recursive-include common *.json配置无需修改。检查配置匹配项
你报错中提示找不到的文件是category_theme_mapping.json,但代码中加载的是mapping.json,请确认实际文件名和代码中传入的文件名是否一致,避免拼写错误。验证Flex Template构建逻辑
确认Dockerfile中复制项目代码时,是复制整个项目根目录到镜像工作目录,不要仅筛选复制.py文件,漏掉JSON资源。
调试技巧
如果修改后仍然报错,可以在_load_category_theme_mapping函数前加一行调试代码,输出common目录下的所有文件,快速定位资源是否被正确打包:
print("common目录下的文件:", list(Path(__file__).parent.iterdir()))
内容的提问来源于stack exchange,提问作者Praneeth Peiris

