Модули IPython - PullRequest
       26

Модули IPython

4 голосов
/ 23 июня 2009

У меня есть несколько сценариев IPython, которые имеют избыточную функциональность. Я хотел бы реорганизовать общую функциональность в один модуль и включить эти модули в существующий скрипт. Проблема в том, что его нельзя сделать модулем Python, так как в коде используются языковые расширения Ipython (!, $ И т. Д.) Можно ли создать модуль с кодом IPython и включить его в другие сценарии IPython?

Ответы [ 6 ]

7 голосов
/ 23 июня 2009

Вы не должны сохранять файлы расширения IPython (?, !, %run) в файлах. Когда-либо. Это интерактивные инструменты, которые вы набираете своими руками, но никогда не сохраняете в файл.

  1. Найдите общие черты среди ваших файлов. У вас есть ровно четыре вида вещей, которые являются кандидатами на это.

    • Импорт (import)

    • Определения функций (def)

    • Определения классов (class)

    • Назначения глобальной переменной

    Вы должны удалить все интерактивные функции IPython из этого кода. Все это.

  2. Перепишите ваши сценарии, чтобы они (1) импортировали ваши общие материалы, (2) выполняли полезную работу, которую они должны были делать.

    Вы должны удалить все интерактивные функции IPython из этого кода. Все это.

    Теперь вы можете запускать свои скрипты, и они выполняют свою работу так, как предполагается для правильных скриптов Python.

Вы все еще можете использовать функции расширения IPython, такие как !, ? и %run, когда вы печатаете, но вы не должны сохранять их в файлах.

4 голосов
/ 23 июня 2009
Технически

, если вы сохраните скрипт с расширением .ipy, ipython увидит это и будет использовать все свои причудливые вещи, а не передавать его непосредственно интерпретатору python. тем не менее, я бы вообще рекомендовал против этого и пошел бы по маршруту S.Lott выше.

3 голосов
/ 07 октября 2011

Многие люди твердо убеждены, что в них не должно быть сценариев с синтаксисом IPython, но если вы достаточно любопытны (как и я) и ищете интересные способы смешать сценарии Python и shell, вам следует Оформить заказ на мою программу-оболочку на github

Пример использования:

$ 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

Как оказалось, ядро ​​IPython также поддерживает (едва функциональную) версию вышеуказанного скрипта:

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.
2 голосов
/ 25 июня 2009

Если вы вводите команды в интерактивную версию IPython, а затем используете команду Hist (с -n для удаления номеров строк), IPython выплевывает все команды, которые вы выполняли, с реальным кодом Python, используемым вместо ! cd! ls и т. д. Вот пример.

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

http://ipython.scipy.org/moin/IpythonExtensionApi объясняет этот объект. Это в основном то, что вам нужно сделать (адаптировано по ссылке):

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

Теперь весь код, который вы вставили из команды Hist в оболочку IPython, должен работать нормально.

0 голосов
/ 22 декабря 2015

Вы можете сделать это.

Вот пример.

Это содержимое файла .ipy:

%run b.ipy

print(myvar)
print(myfunc())

Это содержимое файла b.ipy:

myvar = !echo 1

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

Как вы можете видеть, b.ipy использует! оператор. Когда вы выполните a.ipy, вы получите следующий результат:

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

Таким образом, вы «импортируете» «модули» не так, как вы делаете это в python, но как вы делаете это в оболочке с source.

Но я не уверен, что это правильно, может быть, так и есть. По крайней мере, он работает и позволяет извлекать общие функции и использовать их из других файлов сценариев.

0 голосов
/ 23 июня 2009

Вы смотрели на модуль IPython (pydoc IPython)? возможно, вы можете получить доступ к утилитам IPython через чистый код Python.

...