Python : 如何从导入的模块调用全局函数
Python : How to call a global function from a imported module
是否可以从 Python 3 中的导入函数调用全局函数?
./folders/folder1/def.py
def do_test():
print("++ def.do_test()")
global_function_1()
print("-- def.do_test()")
./main.py
import importlib
def global_function_1():
print("doing function 1 thing...")
mod = importlib.import_module('folders.folder1.def')
mod.do_test()
我有这样的错误。
++ def.do_test()
Traceback (most recent call last):
File "C:\src\python\class2\main.py", line 10, in <module>
mod.do_test()
File "C:\src\python\class2\folders\folder1\def.py", line 4, in do_test
global_function_1()
NameError: name 'global_function_1' is not defined
显然,如果在同一个文件中定义相同的函数,则可以正常工作。
def global_function_1():
print("calling the global function 1")
def do_test():
print("++ def.do_test()")
global_function_1()
print("-- def.do_test()")
do_test()
结果是
++ def.do_test()
calling the global function 1
-- def.do_test()
如果 Python 不允许这样做,最接近的替代方案是什么?
在我的真实项目中,全局函数有访问全局的次数
变量。如果可能的话,我想避免放置所有全局函数
和单独的 class.
中的变量
编辑:以上是突出显示我的问题的代码摘录。在我的真实项目中,
- 我有十几个全局函数。因此,不优先通过函数参数传递其指针。
- 我在多个文件夹中还有许多其他 def.py 文件。我需要根据各种条件在运行时选择 def.py 文件。因此,从 main.py 到 def.py 的静态引用不被优先考虑。
您创建的称为模块。如果它没有导入到它使用的文件中,它就不能使用。在你的情况下,def.py 需要导入 main.
可以这样导入:
from moduleFilename import moduleFunctionname
然后你可以
moduleFunctionname()
选择:
import moduleFilename
moduleFilename.moduleFunctionname()
编辑:Rawing 的评论似乎更快...
如果您想 folders.folder1.def
独立于向后导入的东西,因为它看起来像库或插件之类的东西,您可以求助于将其作为回调获取:
图书馆:
def do_test(callback):
print("++ def.do_test()")
callback()
print("-- def.do_test()")
主模块:
import importlib
def global_function_1():
print("doing function 1 thing...")
mod = importlib.import_module('folders.folder1.def')
mod.do_test(global_function_1)
我能够main.py
使用以下设置。
(请注意,我必须向 folders
和 folder1
子目录添加一个空的 __init__.py
文件才能使导入工作。)
文件.\class2\folders\folder1\def.py
from main import global_function_1
def do_test():
print("++ def.do_test()")
global_function_1()
print("-- def.do_test()")
文件.\class2\main.py
import importlib
def global_function_1():
print("doing function 1 thing...")
if __name__ == '__main__':
mod = importlib.import_module('folders.folder1.def')
mod.do_test()
输出:
++ def.do_test()
doing function 1 thing...
-- def.do_test()
是否可以从 Python 3 中的导入函数调用全局函数?
./folders/folder1/def.py
def do_test():
print("++ def.do_test()")
global_function_1()
print("-- def.do_test()")
./main.py
import importlib
def global_function_1():
print("doing function 1 thing...")
mod = importlib.import_module('folders.folder1.def')
mod.do_test()
我有这样的错误。
++ def.do_test()
Traceback (most recent call last):
File "C:\src\python\class2\main.py", line 10, in <module>
mod.do_test()
File "C:\src\python\class2\folders\folder1\def.py", line 4, in do_test
global_function_1()
NameError: name 'global_function_1' is not defined
显然,如果在同一个文件中定义相同的函数,则可以正常工作。
def global_function_1():
print("calling the global function 1")
def do_test():
print("++ def.do_test()")
global_function_1()
print("-- def.do_test()")
do_test()
结果是
++ def.do_test()
calling the global function 1
-- def.do_test()
如果 Python 不允许这样做,最接近的替代方案是什么? 在我的真实项目中,全局函数有访问全局的次数 变量。如果可能的话,我想避免放置所有全局函数 和单独的 class.
中的变量编辑:以上是突出显示我的问题的代码摘录。在我的真实项目中,
- 我有十几个全局函数。因此,不优先通过函数参数传递其指针。
- 我在多个文件夹中还有许多其他 def.py 文件。我需要根据各种条件在运行时选择 def.py 文件。因此,从 main.py 到 def.py 的静态引用不被优先考虑。
您创建的称为模块。如果它没有导入到它使用的文件中,它就不能使用。在你的情况下,def.py 需要导入 main.
可以这样导入:
from moduleFilename import moduleFunctionname
然后你可以
moduleFunctionname()
选择:
import moduleFilename
moduleFilename.moduleFunctionname()
编辑:Rawing 的评论似乎更快...
如果您想 folders.folder1.def
独立于向后导入的东西,因为它看起来像库或插件之类的东西,您可以求助于将其作为回调获取:
图书馆:
def do_test(callback):
print("++ def.do_test()")
callback()
print("-- def.do_test()")
主模块:
import importlib
def global_function_1():
print("doing function 1 thing...")
mod = importlib.import_module('folders.folder1.def')
mod.do_test(global_function_1)
我能够main.py
使用以下设置。
(请注意,我必须向 folders
和 folder1
子目录添加一个空的 __init__.py
文件才能使导入工作。)
文件.\class2\folders\folder1\def.py
from main import global_function_1
def do_test():
print("++ def.do_test()")
global_function_1()
print("-- def.do_test()")
文件.\class2\main.py
import importlib
def global_function_1():
print("doing function 1 thing...")
if __name__ == '__main__':
mod = importlib.import_module('folders.folder1.def')
mod.do_test()
输出:
++ def.do_test()
doing function 1 thing...
-- def.do_test()