GitHub Action中Python自定义包导入失败问题求助
问题:Python模块导入在GitHub Action环境中失败(本地运行正常)
项目结构
code/ |-- __init__.py |-- global_code/ | |-- all_process.py |-- africa/ | |-- egypt/ | | |-- egypt_workflow.py
问题详情
在all_process.py中尝试用import code.africa.egypt.egypt_workflow as ew导入模块,本地运行无问题,但在GitHub Action的Ubuntu环境执行时,报错:
ModuleNotFoundError: No module named 'code.africa'; 'code' is not a package
已尝试但无效的方法
- 添加相对路径到
sys.path:import sys sys.path.append('.') # 也尝试过'..','./','../' - 通过os模块添加上级目录:
import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) - 通过Path模块添加根路径:
该方法打印的from pathlib import Path import sys path_root = Path(__file__).parents[2] sys.path.append(str(path_root)) print(sys.path)sys.path包含/home/runner/work/***/***/code/global_code,但仍报错。 - 尝试相对导入:
报错:import .code.africa.egypt.egypt_workflow as ewImportError: attempted relative import with no known parent package
目前仅以下方式可行,但需为每个国家单独配置,不够优雅:
sys.path.append('./code/africa/') import egypt.egypt_workflow as ee ee.main() sys.path.append('./code/asian/') import japan.japan_workflow as j j.main()
GitHub Action配置参考
name: all_action on: schedule: - cron: 0 22 * * * workflow_dispatch: jobs: all_process: runs-on: ubuntu-latest steps: - name: check code uses: actions/checkout@v3 - name: set up Python 3.10 uses: actions/setup-Python@v4 with: python-version: 3.10 - name: install requirements run: | pip install openpyxl pip install -r requirements.txt - name: run code run: python ./code/global_code/all_process.py - name: commit and push run: | git config user.name "${GITHUB_ACTOR}" git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" git add -A git commit -m "updated" git push
解决方案
方案1:调整GitHub Action的运行命令(推荐)
将Action中run code步骤的命令改为模块方式执行,而非直接运行脚本:
- name: run code run: python -m code.global_code.all_process
-m参数会让Python将项目根目录(code的父目录)加入模块搜索路径,自动识别code作为顶级包,此时无需修改sys.path,直接用import code.africa.egypt.egypt_workflow as ew即可正常导入。
方案2:正确添加项目根目录到sys.path
如果坚持直接运行脚本,需在all_process.py中添加项目根目录(而非global_code或code目录)到sys.path:
from pathlib import Path import sys # 获取项目根目录(即code目录的父目录) project_root = Path(__file__).resolve().parents[1].parent sys.path.append(str(project_root)) # 之后正常导入 import code.africa.egypt.egypt_workflow as ew
之前的错误是因为添加的是global_code目录,Python无法从该路径找到code包,必须添加code的父目录才能让Python识别code作为顶级包。
方案3:使用相对导入(需配合模块方式运行)
如果用方案1的python -m方式运行脚本,可使用相对导入简化代码:
from ...africa.egypt import egypt_workflow as ew
...表示从当前模块(global_code/all_process.py)往上跳两级:先到code目录,再到项目根目录,从而找到africa包。
内容的提问来源于stack exchange,提问作者KowComical
相关产品推荐
相关产品推荐

