Вопрос

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

Это было полезно?

Решение

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

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

    • Импорт (import)

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

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

    • Присвоения глобальных переменных

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

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

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

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

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

Другие советы

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

Многие люди твердо убеждены, что у вас не должно быть скриптов с синтаксисом 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.

Если вы вводите команды в интерактивную версию 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, должен работать нормально.

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

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

Вот пример.

Это содержимое файла .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']

Итак, вы " импортируете " & Quot; модули & Quot; не так, как вы делаете это в python, но как вы делаете это в оболочке с source .

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top