python - 在 IPython 中执行 .py 文件

标签 python ipython

有没有办法从笔记本中运行包含函数等的 .py 文件,以便将 .py 文件的内容视为直接在那个单元格中?

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

最佳答案

在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/

相关文章:

python - 如何在 Django 自定义身份验证后端中出现错误消息

python - 让 .eq 忽略 NAN 值

python - 如何展平在 PySpark 中使用 zip 转换创建的元组

python - Plotly Ipython - 显示(HTML)函数不显示 html 文件

python - Appengine - 报告实验室 PDF

python - 从xml数据中获取第二个标签值

python - 在Python中找不到指定相对路径的文件

python - 使用 Python 和 elasticsearch,如何遍历返回的 JSON 对象?

ipython - 在spyder中无法获取ipython控制台

numpy - 如何在 Ubuntu 上安装最新版本的 NumPy/Scipy/Matplotlib/IPython/Pandas