Pregunta

Tengo algunos scripts de IPython que tienen funcionalidad redundante. Me gustaría refactorizar la funcionalidad común en un módulo e incluir esos módulos en el script existente. El problema es que no se puede hacer un módulo de Python ya que el código usa las extensiones de lenguaje de Ipython (!, $, Etc.). ¿Es posible hacer un módulo con código IPython e incluirlo en otros scripts de IPython?

¿Fue útil?

Solución

No debería guardar las extensiones de IPython (? , ! , % run ) en archivos. Siempre. Esas son herramientas interactivas y son algo que escribe con las manos pero nunca guarda en un archivo.

  1. Encuentra las características comunes entre tus archivos. Tienes exactamente cuatro tipos de cosas que son candidatas para esto.

    • Importaciones ( importación )

    • Definiciones de funciones ( def )

    • Definiciones de clase ( clase )

    • Asignaciones de variables globales

    Debe eliminar todas las funciones interactivas de IPython de este código. Todo ello.

  2. Reescribe tus scripts para que (1) importen tus cosas comunes, (2) hagan el trabajo útil que se supone que deben hacer.

    Debe eliminar todas las funciones interactivas de IPython de este código. Todo ello.

    Ahora puede ejecutar sus scripts y ellos hacen su trabajo como se supone que son los scripts de Python adecuados.

Todavía puede usar las funciones de extensión de IPython como ! , ? y % run cuando está escribiendo, pero no debe guardarlas en archivos.

Otros consejos

técnicamente, si guarda una secuencia de comandos con la extensión .ipy , ipython lo verá y usará todas sus cosas sofisticadas en lugar de pasar directamente al intérprete de Python. sin embargo, generalmente recomendaría contra esto, y seguir la ruta de S.Lott arriba.

Mucha gente cree firmemente que se supone que no debe tener scripts con la sintaxis de IPython, pero si tenía curiosidad (como yo) y está buscando formas divertidas de mezclar scripts de Python y Shell, debería mira mi programa de envoltura en github

Caso de uso de ejemplo:

$ 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

Como resultado, el núcleo de IPython también es compatible con una versión (apenas funcional) del script anterior:

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.

Si ingresa los comandos en una versión interactiva de IPython y luego usa el comando hist (con -n para eliminar los números de línea), IPython escupe todos los comandos que ejecutó, con el código real de Python utilizado en lugar de ! cd! ls, etc. He aquí un ejemplo.

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

http://ipython.scipy.org/moin/IpythonExtensionApi explica este objeto. Esto es básicamente lo que debe hacer (adaptado del enlace):

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

Ahora todo el código que pegó del comando hist del shell de IPython debería funcionar bien.

¿Ha echado un vistazo al módulo IPython ( pydoc IPython )? tal vez pueda acceder a las utilidades de IPython a través del código Python puro.

Puedes hacerlo.

Aquí hay un ejemplo.

Este es el contenido de un archivo .ipy:

%run b.ipy

print(myvar)
print(myfunc())

Este es el contenido del archivo b.ipy:

myvar = !echo 1

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

Como puedes ver, b.ipy usa! operador. Cuando ejecuta a.ipy, obtiene el siguiente resultado:

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

Entonces, "importas" " módulos " no como si lo hicieras en python, sino como si lo hicieras en shell con source .

Pero no estoy seguro de si es la forma correcta, tal vez lo sea. Al menos funciona y le permite extraer funcionalidades comunes y reutilizarlas de otros archivos de script.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top