You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅修改runner.py实现Python3全局作用域跨文件夹函数调用

问题解决:无需修改子模块,在runner.py中全局注入函数实现跨模块调用

环境与目录结构

开发环境:Linux Mint 21 + Python 3.x
项目目录结构:

└── main_dir/
    ├── all_files_dir/
    │   ├── a_files_dir/
    │   │   └── file_a.py
    │   ├── b_files_dir/
    │   │   └── file_b.py
    │   └── c_files_dir/
    │       └── file_c.py
    └── runner.py

各文件内容

  • file_a.py
def function_a():
    print("a ran")
    return "a return value "
  • file_b.py
def function_b():
    print("b ran")
    return "b return value "
  • file_c.py
def function_c():
    print("this function STARTS running!!!")
    result_of_function_a = a()
    result_of_function_b = b()
    results_of_both_functions = result_of_function_a + result_of_function_b
    print("results_of_both_functions", results_of_both_functions)
  • 原runner.py
from all_files_dir.a_files_dir.file_a import function_a as a
a() # This Works!

from all_files_dir.b_files_dir.file_b import function_b as b
b() # This Works!

from all_files_dir.c_files_dir.file_c import function_c as c
c() # This STARTS working and prints 'this function STARTS running!!!'
# This FAILS eventually!!!

报错信息

运行原runner.py后报错:

a ran
b ran
this function STARTS running!!!
Traceback (most recent call last):
  File ".../main_dir/runner.py", line 8, in <module>
    c() # This STARTS working and prints 'this function STARTS running!!!'
  File ".../main_dir/all_files_dir/c_files_dir/file_c.py", line 3, in function_c
    result_of_function_a = a()
NameError: name 'a' is not defined

需求说明

不修改all_files_dir目录下的任何文件,仅修改runner.py,将function_a()导入为a()、function_b()导入为b()、function_c()导入为c(),使三者处于可互相调用的全局作用域。

解决方案

核心思路是将runner.py中导入的a和b注入到file_c模块的全局命名空间中,这样function_c运行时就能找到这两个函数。修改后的runner.py如下:

# 先导入a和b
from all_files_dir.a_files_dir.file_a import function_a as a
from all_files_dir.b_files_dir.file_b import function_b as b

# 导入file_c模块(而非直接导入function_c)
import all_files_dir.c_files_dir.file_c as file_c_module
# 将a、b注入到file_c模块的全局变量中
file_c_module.a = a
file_c_module.b = b

# 再将function_c导入为c
from all_files_dir.c_files_dir.file_c import function_c as c

# 测试调用
a()
b()
c()

运行修改后的runner.py,即可正常输出:

a ran
b ran
a ran
b ran
this function STARTS running!!!
results_of_both_functions a return value b return value 

内容的提问来源于stack exchange,提问作者Pavel Bogdanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:00:20