尝试自写模块时,它可能会在最初的几次错误中结束。

但是在修复这些错误时,ipython似乎没有注意到这一点。

是否有一个ipython命令来重新加载新模块? “清除”并不能解决问题。到目前为止,唯一有效的方法是“退出”并开始新的 session 。但这也意味着重做我到目前为止所做的一切。

还是我需要在模块中添加一些东西,使其在运行后杀死所有内部变量?

示例:

from mymodule import readCSVts
import pandas as pd
data = readCSVts('file.csv')

TypeError                                 Traceback (most recent call last)
<ipython-input-158-8f82f1a78260> in <module>()
----> 1 data = readCSVts('file.csv')

/home/me/path/to/mymodule.py in readCSVts(filename)
    194                 Cons_NaNs=hydroTS[(hydroTS.level.isnull())&(hydroTS.level.shift().isnull())&(hydroTS.level.shift(periods=2).isnull())]
    195                 #This is a pandas dataframe containing all rows with NaN
    196                 Cons_NaNs_count = len(Cons_NaNs)
    197                 Cons_NaNs_str = str(Cons_NaNs_count)
    198                 Cons_NaN_Name_joiner = [current_csv,';',Cons_NaNs]
--> 199                 Cons_NaN_Name_str = ''.join(Cons_NaN_Name_joiner)

TypeError: sequence item 2: expected string, DataFrame found

好,很简单。我在第198行打了一个错字,然后写了Cons_NaNs而不是Cons_NaNs_str,因此我遇到了一个明显的错误,即试图用字符串连接数据框。

但是在mymodule.py文件中修复它之后,出现以下(缩短的)错误:
    197                 Cons_NaNs_str = str(Cons_NaNs_count)
    198                 Cons_NaN_Name_joiner = [current_csv,';',Cons_NaNs_str]
--> 199                 Cons_NaN_Name_str = ''.join(Cons_NaN_Name_joiner)

TypeError: sequence item 2: expected string, DataFrame found

查看回溯,ipython很好地了解了源文件中所做的更改,它表明我使用缺少的_str修复了错字,但仍然出现错误,乍一看似乎是不可能的。运行clear并重新导入所有内容后,它显示出相同的行为。

因此,为了确保在整个过程中都没有犯一个愚蠢的错误,我在ipython中一步步走完了整个模块。每个导致我达到这一点的变量都表现出预期的效果。
Cons_NaNs是一个数据帧,Cons_NaNs_count是一个整数,Cons_NaNs_str是一个字符串。

因此,我退出了ipython,重新启动了它,然后重新导入了所有内容,现在它可以工作了。

但是必须退出ipython很烂。在大多数情况下,这意味着必须重新导入许多东西并执行几十个命令,以使我可以实际测试当前正在做的事情。

最佳答案

这不仅用于ipython,而且通常在将Python首次导入sys.modules时将其缓存。因此,在首次导入之后,无论何时尝试导入,都将从sys.modules获得缓存的模块对象。

要使Python重新加载模块对象而不必重新启动Python,以便反射(reflect)对模块所做的更改,应使用 reload() built-in function (Python 2.x) importlib.reload() (Python 3.x)

Python 2.x-

<module> = reload(<module>)

例子 -
import module
module = reload(module) #This requires the module as it is, not a string.

Python 3.x-
import importlib
<module> = importlib.reload(<module>)

与上面的Python 2.x示例类似,只需使用importlib.reload()而不是reload()

关于python - 如何让ipython知道对自写模块所做的更改?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32269102/

10-12 00:32
查看更多