gpt4 book ai didi

python - 在 IPython 中执行 .py 文件

转载 作者:太空宇宙 更新时间:2023-11-04 00:48:50 25 4
gpt4 key购买 nike

有没有办法从笔记本中运行包含函数等的 .py 文件,这样 .py 文件的内容就好像它是直接在那个牢房里?

例如,假设我有一个文件 example.py,其中定义了一个函数 test1,它调用了一个函数 test4,该函数被定义在 ipython 笔记本中。如果我通过 %run examplye.py 运行 example.py,函数 test4 对于 test1 是未知的。这可以规避吗?

最佳答案

在 Python2 中,execfile 函数会执行您想要的操作。在 Python 3 中,您必须通过读取文件内容、编译它然后确保它在正确的命名空间中执行来模拟它。

在我定义的笔记本单元格中:

def f4(x):
return x+x

我有一个包含以下代码的文件 testme.py:

f4("something")

以下代码单元似乎可以正确执行文件中的代码:

with open("testme.py") as f:
code = compile(f.read(), "testme.py", 'exec')
exec(code, globals(), locals())

它确实按预期打印了 "somethingsomething"

如评论中所述,要调试已更改的模块,您可以使用 reload() (Python2) 或 importlib.reload() 重新导入它。但是您的代码的耦合相当紧密——它总是会在全局命名空间中寻找相同的函数。这使得测试变得非常困难,最好考虑依赖注入(inject)方法。假设您的函数如下所示:

def my_func(a, b):
...
f4(something)
...
return result

这必须在其全局命名空间中找到 f4 函数。更好的耦合解决方案如下所示:

def my_func(a, b, f):
...
f(something)
...
return result

然后您调用 my_func 并将 f4 作为其第三个参数 - 您可以绝对控制它调用的函数,并且可以在测试期间根据需要使用其他函数更仔细地检测代码,您的代码不再需要该函数位于调用模块的全局命名空间中 - 您可以将任何您喜欢的函数传递给它。

关于python - 在 IPython 中执行 .py 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38056895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com