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?

È stato utile?

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.

  1. 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.

  2. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top