冗長な機能を持つIPythonスクリプトがいくつかあります。共通の機能を1つのモジュールにリファクタリングし、そのモジュールを既存のスクリプトに含めたいと思います。問題は、コードがIpythonの言語拡張機能(!、$など)を使用しているため、Pythonモジュールにすることができないことです。IPythonコードを含むモジュールを作成し、それを別のIPythonスクリプトに含めることは可能ですか?
6 に答える
IPython拡張機能(、、)をファイルに保存しない?
でください!
。%run
これまで。これらはインタラクティブなツールであり、手で入力するものですが、ファイルに保存することはありません。
ファイルに共通する機能を見つけます。これの候補となるのはちょうど4種類あります。
インポート(
import
)関数定義(
def
)クラス定義(
class
)グローバル変数の割り当て
このコードからすべてのIPythonインタラクティブ機能を削除する必要があります。それのすべて。
スクリプトを書き直して、(1)一般的なものをインポートし、(2)スクリプトが実行するはずの便利な作業を実行するようにします。
このコードからすべてのIPythonインタラクティブ機能を削除する必要があります。それのすべて。
これで、スクリプトを実行でき、適切なPythonスクリプトが想定されているように動作します。
!
、?
などのIPython拡張機能は引き続き使用でき%run
ますが、入力時にこれらをファイルに保存しないでください。
技術的には、.ipy
拡張子を付けてスクリプトを保存すると、ipythonはそれを認識し、Pythonインタープリターに直接渡すのではなく、すべての凝ったものを使用します。しかし、私は一般的にこれに反対し、上記のS.Lottのルートに行くことをお勧めします。
多くの人は、IPython構文を含むスクリプトは想定されていないと強く信じていますが、(私がそうであるように)十分に興味があり、Pythonとシェルスクリプトを組み合わせる楽しい方法を探している場合は、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は実行したすべてのコマンドを吐き出し、!cd!の代わりに実際のpythonコードを使用します。 lsなど。例を次に示します。
_ip.system("ls")
_ip.system("ls -F ")
_ip.magic("cd ")
http://ipython.scipy.org/moin/IpythonExtensionApiでこのオブジェクトについて説明しています。これは基本的にあなたがする必要があることです(リンクから適応):
import IPython.ipapi
_ip = IPython.ipapi.get()
これで、IPythonシェルのhistコマンドから貼り付けたすべてのコードが正常に機能するはずです。
あなたはそれを行うことができます。
これが例です。
これは.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
。
しかし、それが正しいかどうかはわかりませんが、そうであるかもしれません。少なくともそれは機能し、一般的な機能を抽出して他のスクリプトファイルから再利用することができます。
IPythonモジュール(pydoc IPython
)を見たことがありますか?純粋なPythonコードを介してIPythonのユーティリティにアクセスできるかもしれません。