这是我在这里的第一篇文章,所以如果我做错了,请告诉我。我尝试寻找现有的答案,但不确定要搜索什么。
考虑以下简单示例,一个名为的 python 模块mymath.py
仅使用内置的 python 操作和模块。这个自定义模块是可移植的,因此任何人都可以执行代码,而无需安装除了股票 python 之外的任何东西。
# mymath.py
import sys
def minus(a, b):
return a-b
def mult(a, b):
return a*b
def div(a, b):
return a/b
def plus(a, b):
return a+b
def sum_series(int_list):
sum = 0
for i in int_list:
sum = plus(sum, i)
return sum
def main():
my_list = [2, 4, 6]
value = sum_series(my_list)
sys.stdout.write("your list total = {}".format(value))
请注意,main()
只有 callsum_series()
反过来调用plus()
. 在这个虚构的代码库的其他地方可能需要其他函数,但我们只关心main()
.
现在,我只想将相关的源代码作为文本字符串复制到另一个对象。换句话说,收集main()
及其所有依赖项(递归),产生一串可执行代码。
我目前的解决方案:
import inspect
import mymath
# copy the source code in to the callback
source = inspect.getsource(mymath)
# then append a call to the main function
source += "\nmain()"
这是可行的,将模块的本地副本作为字符串生成,main()
无需导入mymath
. 问题是knob
现在所有额外未使用的功能都变得臃肿,尽管它能够mymath.py
通过重新运行我当前的解决方案来获取我所做的任何更改。
所以,问题是 - 有没有办法做相当于:
source = getFunctionSourcerRecursively(mymath.main)
source += "\nmain()"
导致源 =
# mymath.py
import sys
def plus(a, b):
return a+b
def sum_series(int_list):
sum = 0
for i in int_list:
sum = plus(sum, i)
return sum
def main():
my_list = [2, 4, 6]
sys.stdout.write("your list total = {}".format(sum_series(my_list)))
main()
所以,基本上“源代码”现在只包含相关代码并且是可移植的,不再需要人们在异地安装 mymath。
如果您好奇,我的真实案例涉及使用 The Foundry Nuke(合成应用程序),它有一个内部回调系统,可以在knob
(属性)上触发回调事件时运行代码。我希望能够与异地客户共享这些保存的 Nuke 文件(.nk
或.nknc
),而不需要他们修改他们的系统。