IPython में मैजिक ´run pass फ़ंक्शन के लिए एक चर कैसे पास करें


82

मैं निम्नलिखित की तरह कुछ करना चाहता हूँ:

In[1]: name = 'long_name_to_type_every_now_and_then.py'

In[2]: %run name

लेकिन यह वास्तव में चलाने की कोशिश करता है 'name.py', जो वह नहीं है जो मैं करना चाहता हूं।

क्या चर में तारों को चालू करने का एक सामान्य तरीका है?

कुछ इस प्रकार है:

In[3]: %run %name%

जैसा कि कमांड के समतुल्य है $ python file args, इसलिए मुझे लगता है कि यह संभव नहीं है।
अश्विनी चौधरी

जवाबों:


133

IPython चर $name, बैश-शैली के साथ विस्तार करता है। यह सभी जादूगरों के लिए सच है , न कि सिर्फ %run

तो आप ऐसा करेंगे:

In [1]: filename = "myscript.py"

In [2]: %run $filename
['myscript.py']

myscript.py में शामिल हैं:

import sys
print(sys.argv)

पायथन के फैंसी स्ट्रिंग स्वरूपण के माध्यम से, आप भावों को भी अंदर रख सकते हैं {}:

In [3]: args = ["arg1", "arg2"]

In [4]: %run $filename {args[0]} {args[1][-2:]}
['myscript.py', 'arg1', 'g2']

5
बस यह उल्लेख करना चाहता था कि यह भी बहुत अच्छी तरह से काम करता है जब सिर्फ एक विस्मयादिबोधक चिह्न (!) का उपयोग करके मनमाने ढंग से शेल कमांड चला रहा है - आधिकारिक डॉक्स देखें - ipython.org/ipython-doc/rel-0.10.2/html/interactive/…
yoniLavi

@minrk बस एक सरल प्रश्न है कि चर और अभिव्यक्ति के बीच अंतर क्या है। क्या एक शब्दकोष एक अभिव्यक्ति है? मैं पूछता हूं क्योंकि आपके उदाहरण के बाद मुझे शब्दकोश का विस्तार करने के लिए फैंसी स्ट्रिंग फॉर्मेटिंग का उपयोग करना पड़ा, लेकिन जब मैंने इसके बजाय $ का उपयोग किया तो असफल रहा। मुझे लगा कि सूचियां, शब्दकोश आदि सभी चर प्रकार हैं।
स्टीफन जैकब

मैंने कोशिश की कि %%htmlसेल मैजिक पर और यह काम न करे। क्या लाइन मैजिक के विपरीत सेल मैजिक के लिए एक अलग सिंटैक्स है?
MROB

संस्करण 7.3 के रूप में, कुछ magicsइस विस्तार करने का विकल्प चुन time, timeit, debugऔर prungithub.com/ipython/ipython/pull/11516
hpaulj

11

get_ipython()वर्तमान इंटरएक्टिव शेड का संदर्भ प्राप्त करने के लिए उपयोग करें , फिर magic()विधि को कॉल करें :

In [1]: ipy = get_ipython()

In [2]: ipy.magic("run foo.py")
ERROR: File `u'foo.py'` not found.

संपादित करें देखें minrk का उत्तर - यह करने के लिए एक बेहतर तरीका है।


1
हालांकि यह करने का सबसे अच्छा तरीका नहीं है, इसने मेरा एक और सवाल का जवाब दिया, जो एक अजगर कंसोल के भीतर ipython मैजिक कमांड को निष्पादित करने का तरीका था (जैसा कि स्पाइडर का उपयोग करते समय)
स्टुप्पी

1

ऐसा लगता है कि यह अंतर्निहित %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

वर्गों की इस जोड़ी का उपयोग करना, (और एक पायथन स्क्रिप्ट दी गई tester.py) यह संभव है कि नए "my_run" मैजिक फ़ंक्शन के साथ "मैक्रो" वैरिएबल बनाएं और उपयोग करें:

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'

हां, यह एक बहुत बड़ा और संभवत: बेकार हैक है। उस नस में, मुझे आश्चर्य है कि अगर मैक्रो ऑब्जेक्ट के लिए बाध्य नाम का एक तरीका है, तो मैक्रो के वास्तविक नाम के रूप में उपयोग किया जा सकता है। उस पर गौर करेंगे।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.