jupyter notebook のはなしです.
rasbt/watermark を使う
https://github.com/rasbt/watermark
を使って,
%load_ext watermark
%watermark -u -d -v -p numpy,pandas,matplotlib
とすると
last updated: 2016-10-12
CPython 3.5.2
IPython 5.1.0
numpy 1.11.1
pandas 0.18.1
matplotlib 1.5.1
というふうに,CPython, IPython,-p
で渡したパッケージのバージョンが出力される.
magic には $var
で変数を渡せるので,モジュール一覧を取得する方法を考える
インポートしたモジュールを取得する
http://stackoverflow.com/questions/20703975/is-there-a-sessioninfo-equivalent-in-python
より,
def imports():
import types
for name, val in globals().items():
if isinstance(val, types.ModuleType):
yield val.__name__
excludes = ['types', 'builtins', 'IPython.core.shadowns']
imported_modules = [module.split(".")[0] for module in imports() if module not in excludes]
とやると一覧がリストになる.
module.split(".")[0]
としているのは,サブモジュールをインポートしている場合があるので.
magic にする
from IPython.core.magic import register_line_magic
@register_line_magic
def imports_(param=''):
def imports():
import types
for name, val in globals().items():
if isinstance(val, types.ModuleType):
yield val.__name__
excludes = ['types', 'builtins', 'IPython.core.shadowns']
imported_modules = [module.split(".")[0] for module in imports() if module not in excludes]
return ",".join(imported_modules)
del imports_
と書いて,適当なファイル名で,.ipython/startup
に置く(.jupyter
ではない).
なお,
def imports_(param=’’):
としているのは,引数なしにすると,引数0なのに1個渡された,的なエラーが出たので.
あとは,jupyter notebook 上で,
imports = %imports_
%load_ext watermark
%watermark -u -d -v -p $imports
とする.
別解: ASTから取得
自分の環境では,notebook(.ipynb) を保存すると同時に .py と .html が保存されるようになっているので,.py を ASTにして,Import と ImportFrom を抜き出す,という方法を考えた.
先ほどのmagic を書いたファイルに以下を追加して,
@register_line_magic
def packages_(source):
import ast
source = open(source, "r", encoding="utf-8").read()
tree = ast.parse(source)
def select_imports(node):
if isinstance(node, ast.Import):
return node.names[0].name.split(".")[0]
elif isinstance(node, ast.ImportFrom):
return node.module.split(".")[0]
else:
return None
imports = [select_imports(node) for node in ast.walk(tree)]
packages = ",".join(list(set([i for i in imports if i is not None])))
return packages
最後のdel
を変更する.
del packages_, imports_
実行
packages = %packages_ notebook.py
%load_ext watermark
%watermark -u -d -v -p $packages