2024-05-07 17:37:02 发布
网友
我想做如下事情:
In[1]: name = 'long_name_to_type_every_now_and_then.py' In[2]: %run name
但这实际上试图运行'name.py',这不是我想做的。
'name.py'
有没有把变量转换成字符串的通用方法?
大致如下:
In[3]: %run %name%
这似乎是不可能的内置%run魔术功能。不过,你的问题让我陷入了困境,我想看看做类似的事情有多容易。最后,要创建另一个只使用execfile()的神奇函数,似乎有些毫无意义。也许这对某个人或某个地方有用处。
%run
execfile()
# custom_magics.py from IPython.core.magic import register_line_magic, magics_class, line_magic, Magics @magics_class class StatefulMagics(Magics): def __init__(self, shell, data): super(StatefulMagics, self).__init__(shell) self.namespace = data @line_magic def my_run(self, line): if line[0] != "%": return "Not a variable in namespace" else: filename = self.namespace[line[1:]].split('.')[0] filename += ".py" execfile(filename) return line class Macro(object): def __init__(self, name, value): self.name = name self._value = value ip = get_ipython() magics = StatefulMagics(ip, {name: value}) ip.register_magics(magics) def value(self): return self._value def __repr__(self): return self.name
使用这对类(并给定一个python脚本tester.py),可以创建一个“macro”变量,并将其与新创建的“my_run”魔术函数一起使用,如下所示:
tester.py
In [1]: from custom_magics import Macro In [2]: Macro("somename", "tester.py") Out[2]: somename In [3]: %my_run %somename I'm the test file and I'm running! Out[3]: u'%somename'
是的,这是一个巨大的,可能是浪费的黑客。在这种情况下,我想知道是否有办法将宏对象的名称绑定为宏的实际名称。会调查的。
IPython使用bash样式的$name扩展变量。这对所有魔法来说都是正确的,而不仅仅是%run。
$name
所以你应该:
In [1]: filename = "myscript.py" In [2]: %run $filename ['myscript.py']
myscript.py包含:
import sys print(sys.argv)
通过Python奇特的字符串格式,您甚至可以将表达式放入{}:
{}
In [3]: args = ["arg1", "arg2"] In [4]: %run $filename {args[0]} {args[1][-2:]} ['myscript.py', 'arg1', 'g2']
使用get_ipython()获取对当前InteractiveShell的引用,然后调用magic()方法:
get_ipython()
magic()
In [1]: ipy = get_ipython() In [2]: ipy.magic("run foo.py") ERROR: File `u'foo.py'` not found.
编辑参见minrk's answer-这是一种更好的方法。
这似乎是不可能的内置
%run
魔术功能。不过,你的问题让我陷入了困境,我想看看做类似的事情有多容易。最后,要创建另一个只使用execfile()
的神奇函数,似乎有些毫无意义。也许这对某个人或某个地方有用处。使用这对类(并给定一个python脚本
tester.py
),可以创建一个“macro”变量,并将其与新创建的“my_run”魔术函数一起使用,如下所示:是的,这是一个巨大的,可能是浪费的黑客。在这种情况下,我想知道是否有办法将宏对象的名称绑定为宏的实际名称。会调查的。
IPython使用bash样式的
$name
扩展变量。这对所有魔法来说都是正确的,而不仅仅是%run
。所以你应该:
myscript.py包含:
通过Python奇特的字符串格式,您甚至可以将表达式放入
{}
:使用
get_ipython()
获取对当前InteractiveShell的引用,然后调用magic()
方法:编辑参见minrk's answer-这是一种更好的方法。
相关问题 更多 >
编程相关推荐