Có vẻ như điều này là không thể với %run
chức năng ma thuật được tích hợp sẵn . Tuy nhiên, câu hỏi của bạn đã dẫn tôi xuống một cái lỗ thỏ và tôi muốn xem làm điều gì đó tương tự sẽ dễ dàng như thế nào. Cuối cùng, có vẻ hơi vô nghĩa nếu cố gắng tạo ra một chức năng ma thuật khác mà chỉ sử dụng execfile()
. Có thể điều này sẽ có ích cho ai đó, ở đâu đó.
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
Sử dụng cặp lớp này, (và được cung cấp một tập lệnh python tester.py
), bạn có thể tạo và sử dụng biến "macro" với hàm ma thuật "my_run" mới được tạo như sau:
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'
Vâng, đây là một vụ hack lớn và có thể lãng phí. Theo cách đó, tôi tự hỏi liệu có cách nào để sử dụng tên liên kết với đối tượng Macro làm tên thực của macro hay không. Sẽ xem xét điều đó.
$ python file args
, vì vậy tôi đoán là không thể.