Question

J'ai quelques scripts IPython qui ont une fonctionnalité redondante. Je voudrais reformuler la fonctionnalité commune en un module et l'inclure dans le script existant. Le problème est qu'il ne peut pas être transformé en module python car le code utilise les extensions de langage d'Ipython (!, $ Etc). Est-il possible de créer un module avec du code IPython et de l’inclure dans un autre script IPython?

Était-ce utile?

La solution

Vous ne devriez pas enregistrer les éléments d'extension IPython (? , ! , % run ) dans des fichiers. Déjà. Ce sont des outils interactifs que vous tapez avec vos mains mais que vous n'enregistrez jamais dans un fichier.

  1. Trouvez les caractéristiques communes parmi vos fichiers. Vous avez exactement quatre types de choses qui sont candidats pour cela.

    • Importations ( importation )

    • Définitions de fonctions ( def )

    • Définitions de classe ( classe )

    • Assignations de variables globales

    Vous devez supprimer toutes les fonctionnalités interactives IPython de ce code. Tout cela.

  2. Réécrivez vos scripts pour qu'ils (1) importent vos documents courants, (2) effectuent le travail utile qu'ils sont censés effectuer.

    Vous devez supprimer toutes les fonctionnalités interactives IPython de ce code. Tout cela.

    Vous pouvez maintenant exécuter vos scripts et leur travail se déroule comme le supposent les scripts Python appropriés.

Vous pouvez toujours utiliser les fonctions d'extension IPython telles que ! , ? et % run lorsque vous tapez, mais vous ne devez pas les enregistrer. dans des fichiers.

Autres conseils

techniquement, si vous enregistrez un script avec l’extension .ipy , ipython le verra et utilisera toutes ses fonctionnalités plutôt que de le transmettre directement à l’interpréteur python. Cependant, je recommanderais généralement de ne pas utiliser cette option et d’inscrire la route de S.Lott ci-dessus.

Beaucoup de gens croient fermement que vous n'êtes pas censé avoir des scripts avec la syntaxe IPython, mais si vous êtes assez curieux (comme je le suis) et que vous cherchez des moyens amusants de mélanger des scripts python et shell, vous devriez vérifier mon programme d'encapsulation sur github

Exemple d'utilisation:

$ 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

En réalité, le noyau IPython prend également en charge une version (à peine fonctionnelle) du script ci-dessus:

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 vous entrez les commandes dans une version interactive d’IPython, puis utilisez la commande hist (avec -n pour supprimer les numéros de ligne), IPython recrache toutes les commandes que vous avez exécutées, avec le code python utilisé à la place de ! cd! ls, etc. Voici un exemple.

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

http://ipython.scipy.org/moin/IpythonExtensionApi explique cet objet. C’est essentiellement ce que vous devez faire (adapté du lien):

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

Maintenant, tout le code que vous avez collé à partir de la commande hist du shell IPython devrait fonctionner correctement.

Avez-vous consulté le module IPython ( pydoc IPython )? peut-être pourrez-vous accéder aux utilitaires d’IPython avec du code Python pur.

Vous pouvez le faire.

Voici un exemple.

Il s'agit du contenu d'un fichier.ipy:

%run b.ipy

print(myvar)
print(myfunc())

Ceci est le contenu du fichier b.ipy:

myvar = !echo 1

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

Comme vous pouvez le voir, b.ipy utilise! opérateur. Lorsque vous exécutez a.ipy, vous obtenez le résultat suivant:

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

Ainsi, vous importez " " modules " pas comme vous le faites en python, mais comme vous le faites en shell avec source .

Mais je ne suis pas sûr si c'est la bonne façon, peut-être que c'est. Au moins, cela fonctionne et vous permet d’extraire des fonctionnalités communes et de les réutiliser à partir d’autres fichiers de script.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top