質問
冗長な機能を持つIPythonスクリプトがいくつかあります。共通の機能を1つのモジュールにリファクタリングし、そのモジュールを既存のスクリプトに含めたいと思います。問題は、コードがIpythonの言語拡張(!、$など)を使用するため、Pythonモジュールを作成できないことです。 IPythonコードを持つモジュールを作成し、別のIPythonスクリプトに含めることは可能ですか?
解決
IPython拡張機能のもの(?
、!
、%run
)をファイルに保存しないでください。今まで。これらはインタラクティブなツールであり、手で入力するものですが、ファイルには保存しません。
-
ファイル間の共通機能を見つけます。これには4種類の候補があります。
-
インポート(
import
) -
関数定義(
def
) -
クラス定義(
class
) -
グローバル変数の割り当て
このコードからすべてのIPythonインタラクティブ機能を削除する必要があります。すべて。
-
-
スクリプトを書き直して、(1)共通のものをインポートし、(2)想定される有用な作業を行うようにします。
このコードからすべてのIPythonインタラクティブ機能を削除する必要があります。すべて。
これでスクリプトを実行できるようになり、適切なPythonスクリプトが想定されているように動作します。
入力中に!
、?
、%run
などのIPython拡張機能を引き続き使用できますが、これらは保存しないでください。ファイルに。
他のヒント
技術的に .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は実行したすべてのコマンドを吐き出し、実際の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()
IPythonシェルのhistコマンドから貼り付けたコードはすべて正常に機能するようになりました。
IPythonモジュール( pydoc IPython
)をご覧になりましたか?たぶん、純粋なPythonコードを通じてIPythonのユーティリティにアクセスできます。
できます。
例を次に示します。
これはa.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
を使用してシェルで行うのが好きです。
しかし、それが正しい方法であるかどうかはわかりません。少なくとも機能し、一般的な機能を抽出して他のスクリプトファイルから再利用できます。