2009-06-23 9 views
4

Ich habe ein paar IPython-Skripte, die redundante Funktionalität haben. Ich möchte die allgemeine Funktionalität in ein Modul umgestalten und diese Module in das bestehende Skript aufnehmen. Das Problem ist, dass es nicht zu einem Python-Modul gemacht werden kann, da der Code Ipythons Spracherweiterungen (!, $ Etc) verwendet. Ist es möglich, ein Modul mit IPython-Code zu erstellen und in ein anderes IPython-Skript einzubinden?IPython-Module

Antwort

7

Sie sollten nicht speichern die IPython Erweiterung Stuff (?, !, %run) in Dateien. Je. Das sind interaktive Werkzeuge, die Sie mit Ihren Händen eingeben, aber niemals in einer Datei speichern.

  1. Finden Sie die gemeinsamen Merkmale unter Ihren Dateien. Sie haben genau vier Arten von Dingen, die Kandidaten dafür sind.

    • Importe (import)

    • Funktionsdefinitionen (def)

    • Klassendefinitionen (class)

    • Zuordnungen globaler Variablen

    Sie müssen alle interaktiven IPython-Funktionen aus diesem Code entfernen. Alles davon.

  2. Schreiben Sie Ihre Skripte neu, damit sie (1) Ihre gemeinsamen Sachen importieren, (2) die nützliche Arbeit verrichten, die sie tun sollen.

    Sie müssen alle interaktiven IPython-Funktionen aus diesem Code entfernen. Alles davon.

    Jetzt können Sie Ihre Skripte ausführen und sie tun ihre Arbeit wie richtige Python-Skripte sollen.

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

+0

Ich bin nicht sicher, wie ich das tun werde. Meine IPython-Skripte ersetzen lediglich Bash-Skripte, die andere Befehle aufrufen. Wenn ich IPython Erweiterung Features wie entfernen würde! etc, ich wäre nicht in der Lage zu erreichen, was ich vorhabe. – sharjeel

+2

@sharjeel: Schauen Sie sich das Unterprozessmodul sorgfältig an. Sie können das "!" mit richtigen subprocess.Popen() -Funktionsaufrufen. Dadurch können Sie Module ohne die Erweiterungen erstellen. –

+2

Es stimmt nicht, dass die IPython-Syntax überhaupt interaktiv verwendet werden kann. Warum hättest du eine .ipy-Erweiterung? Sie können IPython-Syntax in einem Skript verwenden, wenn Sie möchten. –

0

Haben Sie sich das IPython-Modul angesehen (pydoc IPython)? Vielleicht können Sie auf IPython-Dienstprogramme mit reinem Python-Code zugreifen.

4

technisch, wenn Sie ein Skript mit der .ipy Erweiterung speichern, wird Ipython das sehen und alle seine fancy Sachen verwenden, anstatt direkt an den Python-Interpreter übergeben. Ich würde jedoch generell empfehlen, und gehen Sie die Route von S.Lott oben.

2

Wenn Sie die Befehle in eine interaktive Version von IPython eingeben und dann den Befehl hist (mit -n zum Entfernen von Zeilennummern) verwenden, spuckt IPython alle ausgeführten Befehle aus, wobei der eigentliche Python-Code verwendet wird 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 (angepasst vom Link) zu tun:

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

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

+0

Aber für den Rekord, stimme ich mit S. Lott überein – bikemule

+1

Auf neueren Versionen von ipython, werden Sie einfach '_ip = get_ipython()' ausführen. Der '_ip.system()' Befehl ist der gleiche, aber für '_ip.magic()' run '_ip.run_line_magic ('Befehl', 'Argumente')' zum Beispiel: '_ip.run_line_magic ('matplotlib', ' in der Reihe'). Ich habe all diese in einen% load_ext Befehl gesetzt, der den Trick macht. –

3

Viele Leute glauben fest daran, dass Sie keine Skripte mit IPython-Syntax in ihnen haben sollten, aber wenn Sie neugierig genug waren (wie ich) und nach einigen lustigen Möglichkeiten suchen, Python und Shell-Skripte zu mischen sollte meine wrapper program on github

Beispiel Anwendungsfall auszuchecken:

$ 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 funktionale) Version des obigen Skripts:

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. 
+0

Der Link zu Ihrem Skript ist unterbrochen. – ggg

0

Sie können es tun.

Hier ist ein Beispiel.

Dieser Inhalt 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 

verwendet wie Sie sehen b.ipy können! Operator. Wenn Sie ausführen a.ipy Sie 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 tun mit source.

Aber ich bin mir nicht sicher, ob es richtig ist, vielleicht ist es. Zumindest funktioniert es und ermöglicht es Ihnen, allgemeine Funktionalität zu extrahieren und sie aus anderen Skriptdateien wiederzuverwenden.