2017-02-24 [長年日記]
■Jupyter Notebookで実行されているのかチェックしたい
理由はtqdmのimport。いろいろと試したが難しかった。
こんな風にしてみた。
try: # noinspection PyUnresolvedReferences if get_ipython().__class__.__name__ == 'ZMQInteractiveShell': from tqdm import tnrange as trange from tqdm import tqdm_notebook as tqdm else: raise RuntimeError except (NameError, RuntimeError): from tqdm import trange from tqdm import tqdm
WebのNotebookではJavaScript利用のウィジェット、それ以外ではコンソール。
あるいは、
try: # noinspection PyUnresolvedReferences if get_ipython().__class__.__name__ == 'ZMQInteractiveShell': from tqdm import tnrange as trange from tqdm import tqdm_notebook as tqdm else: from tqdm import trange from tqdm import tqdm except (NameError, RuntimeError): trange = range tqdm = lambda x: x
として、ipython hoge.pyの時だけプログレスバーありにしたり。(Atom の Atom Runner みたいな、tqdm が効かない場合にオミットできる)
noinspection は PyCharm用の警告抑止。
QtConsoleは誤認識するので使わないでね。
2017-02-22 [長年日記]
■ name 'IntProgress' is not defined
tqdmをJupyter Notebookで使おうと思ったのだけど、
name 'IntProgress' is not defined
というエラーで使えない。
ソースとかをいろいろ見てみたら ipywidgets パッケージがインストールされていないからみたい。
なんでインストールされていなかったのかはわからない*1けど、まぁ、
conda install ipywidgets
で直った。
condaでなければ
pip install ipywidgets
で。
*1 anacondaを使っていれば入るのだけど、minicondaを使っていたので入ってなかった、ということまではわかっている。
2017-02-10 [長年日記]
■scrapy で取得順をランダムにしたい
うーん。これがデフォルトで搭載されていないのだろうか。
まぁ、その辺の自由度どうにかならない? というissueはありましたけど。
完全にランダムでよければ、キューがメモリに収まっている範囲に限定ですが、こんな感じでできました。
import random import collections from scrapy.squeues import FifoMemoryQueue class RandomizedMemoryQueue(FifoMemoryQueue): def __init__(self): super().__init__() assert isinstance(self.q, collections.deque) def pop(self): q = self.q if q: q.rotate(random.randint(0, len(q) - 1)) return q.pop() if q else None
myproject/my_queue.py とかいう名前で保存します。(myproject が scrapyプロジェクト名として)
で、setting.py とか、設定に、
SCHEDULER_MEMORY_QUEUE = 'myproject.my_queue.RandomizedMemoryQueue'
を追加します。