有没有办法从笔记本中运行包含函数等的 .py
文件,以便将 .py
文件的内容视为直接在那个单元格中?
例如,假设我有文件 example.py
,其中定义了函数 test1
,该函数调用定义的函数 test4
在 ipython 笔记本中。如果我通过 %run examplelye.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
然后,您可以使用 f4
作为第三个参数来调用 my_func
- 您可以绝对控制它调用的函数,并且可以在测试期间使用其他函数(如果您愿意)更仔细地检测代码,并且您的代码不再要求该函数位于调用模块的全局命名空间中 - 您可以向其传递您喜欢的任何函数。
关于python - 在 IPython 中执行 .py 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38056895/