如何仅修改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
相关产品推荐
相关产品推荐

