在IPython中执行.py文件

时间:2016-06-27 14:42:40

标签: python ipython

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

例如,假设我有文件example.py,其中定义了函数test1,该函数调用ipython笔记本中定义的函数test4。如果我通过example.py %run examplye.py运行test4功能test1未知import csv def is_numeric_string(s): """ Determine if argument is a string representing a numeric value. """ for kind in (int, float, complex): try: kind(s) except (TypeError, ValueError): pass else: return True else: return False columns = [] with open('not_a_csv.txt') as f: for line in (line.strip() for line in f): fields = line.split() if fields: # non-blank line? if is_numeric_string(fields[0]): columns[-1] += fields # add fields to the new column else: # start a new column with this line as its header columns.append([line]) rows = zip(*columns) # transpose with open('formatted.csv', 'w') as f: csv.writer(f, delimiter='\t').writerows(rows) 。这可以被规避吗?

1 个答案:

答案 0 :(得分:3)

在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()重新导入它。但是代码的耦合相当紧密 - 它总是在全局命名空间中寻找相同的函数。这使得测试非常困难,并且考虑依赖注入方法可能更好。假设您的函数如下所示:

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

这必须在其全局命名空间中找到f4函数。更好耦合的解决方案看起来像这样:

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

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