Frage

Ich habe ein paar IPython Skripte, die Redundanz-Funktionalität. Ich möchte die gemeinsame Funktionalität in einem Modul zum Umgestalten und umfassen die Module in das bestehende Skript. Das Problem ist, kann es nicht einen Python-Modul gemacht werden, wie der Code IPython die Spracherweiterungen (!, $ Usw.) verwendet. Ist es möglich, ein Modul mit IPython Code und füge ihn in einem anderen IPython Skripte zu machen?

War es hilfreich?

Lösung

Sie sollten nicht das Speichern der IPython Erweiterung stuff (?, !, %run) in Dateien. Je. Das sind interaktive Tools und sie sind etwas, das man mit den Händen geben, aber nie in einer Datei speichern.

  1. Die Gemeinsamkeiten zwischen Dateien. Sie haben genau vier Arten von Dingen, die Kandidaten dafür sind.

    • Import (import)

    • Funktionsdefinitionen (def)

    • Klassendefinitionen (class)

    • Zuordnungen globale Variablen

    Sie müssen alle IPython interaktive Funktionen von diesem Code entfernen. Alles.

  2. Rewrite Ihre Skripte, so dass sie (1) Ihre gemeinsamen Sachen importieren, (2) tun, um die nützliche Arbeit, die sie angeblich sind zu tun.

    Sie müssen alle IPython interaktive Funktionen von diesem Code entfernen. Alles.

    Jetzt können Sie Ihre Skripte laufen und sie sind ihre Arbeit wie richtige Python-Skripte sollen.

Sie können nach wie vor IPython Erweiterung Funktionen wie !, ? und %run verwenden, wenn Sie schreiben, aber Sie sollten nicht diese in Dateien speichern.

Andere Tipps

technisch, wenn Sie ein Skript mit dem .ipy Erweiterung speichern, wird ipython dass sehen und nutzen Sie alle es eher fancy stuff ist als direkt mit dem Python-Interpreter übergeben. Allerdings würde ich generell gegen diese empfehlen, und gehen den Weg der S.Lott oben.

Eine Menge Leute glauben fest daran, Sie nicht angenommen sind Skripte mit IPython Syntax in ihnen haben, aber wenn Sie neugierig genug waren (wie ich bin) und für einige Spaß Möglichkeiten suchen, Python und Shell-Skripte zu mischen, sollten Sie mein Wrapper-Programm auszuchecken auf github

Beispiel Anwendungsfall:

$ cat > example.ipy

rehashx

a = !ls -l | tail -n 3
print a.fields(0)

b = 'foo'
echo bar ${b}

$ ipyscript.py example.ipy

['-rw-r--r--', 'drwxr-xr-x', 'drwxrwxr-x']
bar foo

Wie sich herausstellt, auch die IPython Kern unterstützt eine (kaum funktionsfähig) Version des obigen Skript:

In [2]: IPython.core.interactiveshell.InteractiveShell.safe_execfile_ipy?
Type:       instancemethod
Base Class: <type 'instancemethod'>
String Form:<unbound method InteractiveShell.safe_execfile_ipy>
Namespace:  Interactive
File:       /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/interactiveshell.py
Definition: IPython.core.interactiveshell.InteractiveShell.safe_execfile_ipy(self, fname)
Docstring:
Like safe_execfile, but for .ipy files with IPython syntax.

Parameters
----------
fname : str
    The name of the file to execute.  The filename must have a
    .ipy extension.

Wenn Sie geben die Befehle in eine interaktive Version von IPython und dann den hist Befehl (mit -n Zeilennummern entfernen), IPython spuckt alle Befehle, die Sie lief, mit dem eigentlichen Code Python verwendet anstelle von cd! ls usw. Hier ist ein Beispiel.

_ip.system("ls")
_ip.system("ls -F ")
_ip.magic("cd ")

http://ipython.scipy.org/moin/IpythonExtensionApi erklärt dieses Objekt. Dies ist im Grunde, was Sie tun müssen, um (über den Link angepasst):

import IPython.ipapi
_ip = IPython.ipapi.get()

Nun sind alle der Code, den Sie von der IPython Shell hist Befehl eingefügt sollte funktionieren.

Haben Sie am IPython Modul hatte einen Blick (pydoc IPython)? vielleicht können Sie IPython die Dienstprogramme durch reinen Python-Code zugreifen.

Sie können es tun.

Hier ist ein Beispiel.

Dies ist Inhalt der a.ipy-Datei:

%run b.ipy

print(myvar)
print(myfunc())

Dies ist Inhalt der b.ipy-Datei:

myvar = !echo 1

def myfunc():
  tmp_var = !echo 2
  return tmp_var

Wie Sie b.ipy Anwendungen sehen können! Operator. Wenn Sie a.ipy Sie ausführen erhalten folgendes Ergebnis:

ipython a.ipy 
['1']
['2']

Also, Sie „Import“ „Module“ nicht wie Sie es in Python zu tun, sondern wie Sie es in der Schale mit source tun.

Aber ich bin nicht sicher, ob es richtig ist, kann es sich handelt. Zumindest funktioniert es und ermöglicht es Ihnen, gemeinsame Funktionalität zu extrahieren und sie von anderen Skriptdateien wiederverwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top