我正在开发一个Python笔记本,我希望将大输入代码[输入] 打包成一个[* .PY]文件并从笔记本中调用这些文件。
我知道从Notebook运行[ .PY]文件的操作,并且命令因Linux或Windows而异。 但是当我执行此操作并从笔记本执行[.PY]文件时,它无法识别笔记本中加载的任何现有库或变量(就像[ .PY]文件从零开始......)。
有什么方法可以解决这个问题吗?
问题的一个可能的简化示例如下:
In[1]:
import numpy as np
import matplotlib.pyplot as plt
In[2]:
def f(x):
return np.exp(-x ** 2)
In[3]:
x = np.linspace(-1, 3, 100)
In[4]:
%run script.py
“ script.py ”的内容如下:
plt.plot(x, f(x))
plt.xlabel("Eje $x$",fontsize=16)
plt.ylabel("$f(x)$",fontsize=16)
plt.title("Funcion $f(x)$")
答案 0 :(得分:48)
在%run
magic documentation中,您可以找到:
-i 在IPython的命名空间中运行该文件而不是空文件。如果您正在尝试使用文本编辑器编写的代码,这非常有用,该编辑器依赖于交互式定义的变量。
因此,提供-i
可以解决问题:
%run -i 'script.py'
"正确"这样做的方式
也许上面的命令正是你所需要的,但是随着这个问题的全部关注,我决定为那些不知道更多pythonic方式的人增加几分钱。
上面的解决方案有点hacky,并且使另一个文件中的代码混乱(这个x
变量来自哪里?什么是f
函数?)。
我想告诉你如何在不必一次又一次地执行其他文件的情况下这样做。
只需将其转换为具有自己的功能和类的模块,然后从您的Jupyter笔记本或控制台导入它。这也具有使其易于重复使用的优点,并且jupyters contextassistant可以帮助您进行自动完成,或者如果您编写了文档字符串,则会显示文档字符串。
如果您不断编辑其他文件,则autoreload
会向您提供帮助。
你的例子看起来像这样:
的 script.py 强>
import matplotlib.pyplot as plt
def myplot(f, x):
"""
:param f: function to plot
:type f: callable
:param x: values for x
:type x: list or ndarray
Plots the function f(x).
"""
# yes, you can pass functions around as if
# they were ordinary variables (they are)
plt.plot(x, f(x))
plt.xlabel("Eje $x$",fontsize=16)
plt.ylabel("$f(x)$",fontsize=16)
plt.title("Funcion $f(x)$")
Jupyter控制台
In [1]: import numpy as np
In [2]: %load_ext autoreload
In [3]: %autoreload 1
In [4]: %aimport script
In [5]: def f(x):
: return np.exp(-x ** 2)
:
:
In [6]: x = np.linspace(-1, 3, 100)
In [7]: script.myplot(f, x)
In [8]: ?script.myplot
Signature: script.myplot(f, x)
Docstring:
:param f: function to plot
:type f: callable
:param x: x values
:type x: list or ndarray
File: [...]\script.py
Type: function
答案 1 :(得分:7)
也许不是很优雅,但它确实起到了作用:
exec(open("script.py").read())
答案 2 :(得分:6)
以下几行也可以
let cell = yourTableView.cellForRow(at: selectedIndexPath)
cell.contentView.addSubview(secondViewController.view)
答案 3 :(得分:3)
!python'script.py'
用您的真实文件名替换script.py,请不要忘记''