Domanda
Ho alcuni script IPython con funzionalità ridondanti. Vorrei riformattare la funzionalità comune in un modulo e includerli nello script esistente. Il problema è che non è possibile creare un modulo Python poiché il codice utilizza le estensioni del linguaggio di Ipython (!, $ Ecc.). È possibile creare un modulo con codice IPython e includerlo in altri script IPython?
Soluzione
Non dovresti salvare i file dell'estensione IPython (?
, !
, % run
) nei file. Mai. Questi sono strumenti interattivi e sono qualcosa che digiti con le mani ma non salvi mai su un file.
-
Trova le funzionalità comuni tra i tuoi file. Hai esattamente quattro tipi di cose che sono candidati per questo.
-
Importazioni (
import
) -
Definizioni delle funzioni (
def
) -
Definizioni di classe (
class
) -
Assegnazioni di variabili globali
È necessario rimuovere tutte le funzionalità interattive di IPython da questo codice. Tutto.
-
-
Riscrivi i tuoi script in modo che (1) importino le tue cose comuni, (2) facciano il lavoro utile che dovrebbero fare.
È necessario rimuovere tutte le funzionalità interattive di IPython da questo codice. Tutto.
Ora puoi eseguire i tuoi script e loro fanno il loro lavoro come si suppone che siano corretti gli script Python.
Puoi ancora usare le funzionalità di estensione di IPython come !
, ?
e % run
quando stai digitando, ma non dovresti salvarle nei file.
Altri suggerimenti
tecnicamente se salvi uno script con l'estensione .ipy
, ipython lo vedrà e userà tutte le sue cose fantasiose invece di passare direttamente all'interprete python. tuttavia, in genere consiglierei di non farlo e seguirò il percorso di S. Lott sopra.
Molte persone credono fermamente che non dovresti avere script con sintassi IPython, ma se tu fossi abbastanza curioso (come lo sono io) e stai cercando alcuni modi divertenti per mescolare script Python e shell, dovresti controlla il mio programma wrapper su github
Esempio di utilizzo:
$ 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
A quanto pare, il core IPython supporta anche una versione (a malapena funzionale) dello script sopra:
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.
Se inserisci i comandi in una versione interattiva di IPython e poi usi il comando hist (con -n per rimuovere i numeri di riga), IPython sputa fuori tutti i comandi che hai eseguito, con il vero codice python usato al posto di ! cd! ls, ecc. Ecco un esempio.
_ip.system("ls")
_ip.system("ls -F ")
_ip.magic("cd ")
http://ipython.scipy.org/moin/IpythonExtensionApi spiega questo oggetto. Questo è fondamentalmente ciò che devi fare (adattato dal link):
import IPython.ipapi
_ip = IPython.ipapi.get()
Ora tutto il codice incollato dal comando hist della shell IPython dovrebbe funzionare correttamente.
Hai dato un'occhiata al modulo IPython ( pydoc IPython
)? forse puoi accedere alle utility di IPython tramite puro codice Python.
Puoi farlo.
Ecco un esempio.
Questo è il contenuto del file a.ipy:
%run b.ipy
print(myvar)
print(myfunc())
Questo è il contenuto del file b.ipy:
myvar = !echo 1
def myfunc():
tmp_var = !echo 2
return tmp_var
Come puoi vedere, usa b.ipy! operatore. Quando esegui a.ipy ottieni il seguente risultato:
ipython a.ipy
['1']
['2']
Quindi, " import " & Quot; moduli " non come lo fai in Python, ma come lo fai nella shell con source
.
Ma non sono sicuro che sia la strada giusta, forse lo è. Almeno funziona e ti consente di estrarre funzionalità comuni e riutilizzarle da altri file di script.