檢查 module 裡是否有指定的 module

好饒舌。

只是因為程式目錄下有好幾個 module ,想檢查裏面是否有指定名稱的子 module,有的話就載入,沒有的話就跳過。

在網路上找了一下,說是用 imp 就可以解決了:

程式如下:

# -*- coding: utf-8 -*-
# 依序去 module1, module2, module3, module4 看有沒有 routing,有的話就載入並取出指定的變數。
import imp


channel_routing = []
apps = ['module1', 'module2', 'module3', 'module4']
for app in apps:
    try:
        app_info = imp.find_module(app)
        module = imp.load_module(app, *app_info)
        routing_info = imp.find_module('routing', module.__path__)
        routing = imp.load_module('routing', *routing_info)
        if hasattr(routing, 'channel_routing'):
            channel_routing.extend(getattr(routing, 'channel_routing'))
    except ImportError:
        pass

其實應該再參考 django autodiscover() 或是 django test runner 原始碼的,只是在那個時間點沒想到。

pdfkit/wkhtmltopdf

wkhtmltopdf 是一個可以將網址或是 HTML 檔案轉換為 PDF 的程式。

pdfkit 則是一個 python package (或 library),用來將網址或是 HTML 轉換為 PDF,底層用的是 wkhtmltopdf 。

django-pdfkit 則是給 Django 使用的 app,主要使用 pdfkit ,提供了 PDFView 。要提供產出 PDF 的網頁,只要寫一個繼承自 PDFView 的 View,撰寫 template ,就可以了。

以下是幾個試過以後的心得:

  1. 內部處理順序是先使用 Django template 輸出為 HTML,再用 pdfkit 輸出為 PDF。
  2. 預設用 PATH 去找 wkhtmltopdf,但如果有指定 WKHTMLTOPDF_BIN 這個環境變數的話,就用這裏面的。
  3. 在網址加入 html 參數,表示顯示 HTML,例如:http://server/show_pdf/?html
  4. 在網址加上 inline 參數 ,表示直接顯示 PDF,而非下載,例如:http://server/show_pdf/?inline
  5. 要自訂 pdfkit 使用 wkhtmltopdf 的參數,在繼承的 View 裡加入 pdfkit_options (型態為 dict) 或是自訂 get_pdfkit_options method。
  6. 要自訂輸出的檔名,可以在繼承的 View 裡加入 filename 或是自訂 get_filename method。
  7. wkhtmltopdf 預設不使用 print media-type ,所以在 css 裡加的 print media-type 相關樣式都沒用,除非自訂 pdfkit_options ,加入 {“print-media-type”: “”}。雖然加了 print-media-type 可以強制讓 wkhtmltopdf 參考 print media-type,但是一般可以在網路上查到,使用 print media-type 在每頁加頁次的方法是行不通的,一樣要自訂 pdfkit_options 才行 (參考 wkhtmltopdf -h 說明):{ ‘footer-center’: ‘[page] / [toPage]’}。其他還有調頁面邊界、紙張大小的,也都是要看 wkhtmltopdf 的說明來調整 pdfkit_options 。
  8. bootstrap 3 本身就有支援 print media-type ,直接使用就會有不錯的效果。如果要更漂亮,可以參考 Natshah/bootstrap-print: To manage print media for Twitter Bootstrap v3.
  9. 表格跨頁標題主要是使用 table/thead/tbody 跟調整 css,之前參考的網頁找不到了,這裡直接貼相關的 css 跟 html:
    /* CSS */
    @media print {
      table {display:table;}
      thead {display:table-header-group!important;page-break-after:avoid!important;}
      tbody {display:table-row-group!important;page-break-after: auto!important;}
      tr, img {display:table-row!important;page-break-inside:avoid!important;page-break-after: auto!important;}
      td, th {display:table-cell!important;}
    }
    
    <!-- HTML -->
    <table class="table table-bordered">
      <thead>
        <tr>
            <th class="text-center">編號</th>
            <th class="text-center">姓名</th>
        </tr>
      </thead>
      <tbody>
        <tr>
            <td>1</td>
            <td>王小明</td>
        </tr>
      </tbody>
    </table>
    

電影流水帳(2017/8/4~2017/9/9)

The Shallows poster.jpg
By Source, Fair use, Link

Blake Lively 是絕鯊島的女主角,演過蠻多電影,這次獨挑大樑。她的配偶是演綠燈俠跟死侍的 Ryan Reynolds ,真的是郎才女貌。

  • Central Intelligence (IMDB, Wikipedia),台譯:中央情爆員。之前看預告蠻好笑的,終於等到第四台上映。整體還可以,蠻適合打發時間。
    某天 Calvin 接到之前老同學 Robbie 的電話,兩人聊了起來,並約了要出去吃飯。吃了飯才知道 Robbie 變化很大,而且改了名,現在叫作 Bob。豈料,跟 Bob 的飯局成了奇遇的開始。原來 Bob 是情報員,跟 Calvin 聯繫,是因為 Calvin 在學校時幫助過他,他認為只有 Calvin 能相信。接下來,兩人一同處理、調查情報局裡的內鬼事件。在調查的過程裡,兩人更加了解彼此,最後也順利的解決了案件,並且讓 Bob 走出學生時代的陰影。
  • Jack Reacher: Never Go Back (IMDB, Wikipedia),台譯:神隱任務-永不回頭。個人覺得第一集比較好看,這集雖然也延續了之前動作性,但感覺就有點為賦新詩強說愁的感覺。神盾局副局長 (女主角 Susan )的表現不俗,相當的不錯。
    Jack 陸續跟軍中的 Susan 合作解決案件,兩人慢慢有了感情,直到 Jack 去華府找她時,發現 Susan 昨天被關了起來。Jack 直覺不對,於是不顧接任 Susan 的人的阻撓開始調查。他先找了幫 Susan 辯護的律師,然後將調查到的線索交給他,但是辯護律師隨即被殺死。Jack 趕緊潛入獄中,救出 Susan。在此同時,Jack 也遇到了聲稱是他女兒的 Samantha。三人邊逃邊調查,終於查出真相。原來是某公司因為瀕臨破產,就利用運美國軍火的機會進行運毒。Susan 派出的探員調查發現了,某公司就派人將探員殺死,並且擔心報告寄給 Susan ,所以一不做二不休的,回美國境內誣害 Susan。總之,最後是水落石出了,Samantha 坦白自己是冒充 Jack 的女兒,Susan 恢復清白,Jack 則繼續流浪。
  • Mr. Holmes (IMDB, Wikipedia),台譯:福爾摩斯先生。這次的故事蠻特別的,講的是福爾摩斯的老年。飾演管家 Mrs. Munro 的 Laura Linney 跟飾演福爾摩斯的 Ian McKellen 有相當精彩的對手戲。
    福爾摩斯老了,被老年痴呆症困擾,但他不認輸,試著以蜂王乳跟東洋草藥來挽回。在老年痴呆症的困擾與管家小孩的陪伴裡,他慢慢回想最後一件案子的經過,並試著解開謎底。到最後他終於回想起來,並且串連起所有線索,拼湊出全貌。
    原來最後一件案子,福爾摩斯在受到丈夫 Thomas 的委託進行調查其妻 Ann 以後,確定是 Ann 因為喪子之痛而買了毒藥,原本以為毒藥是要毒害 Thomas ,但之後 Ann 故意走到鐵路上讓火車撞死了。福爾摩斯看到報紙,頓悟到自己大錯特錯,受到打擊,躲到鄉下十幾年,從此一蹶不振。
    就在此時,管家的兒子被胡蜂叮咬過敏,送他到醫院的時候,福爾摩斯跟管家把心結打開了,福爾摩斯很慷慨的將身後所有的財產留給管家以及他的兒子,同時也運用才智解開了管家兒子被叮咬之謎。
  • The Shallows (IMDB, Wikipedia),台譯:絕鯊島。網路評價不錯,剛好第四台有播映,就趁機看完了。
    Nancy 是個醫學院學生,為了忘卻喪母之痛,孤身來到母親以前的海灘衝浪。想不到她在這裡卻遇到了鯊魚,受了傷被困在礁岩上。她運用在醫學院學到的知識,縫合自己的傷口並試圖利用之前衝浪愛好者的運動攝影機錄影,來找到救援。她在錄完影之後,運用之前對鯊魚的觀察,逃到了浮標平台之上,運用這個平台,智取鯊魚。她被海浪沖到岸邊,在此之前沒多久,來沙灘玩的小男孩看到攝影機的影片,找來父親幫忙,正巧就遇到被沖到岸邊的 Nancy,Nancy 因此得救。經過一年的時間,Nancy 終於復元,並和父親跟妹妹一起到海邊衝浪。
  • Cars 3 (IMDB, Wikipedia),台譯:Cars 3-閃電再起。隨著時間的過去,麥坤的寶座被新人挑戰,麥坤失去自信,發生了重大車禍。但是麥坤不肯認輸,決定在新東家的幫忙下,繼續努力。在新東家這兒,他認識了訓練師 Cruz ,但是訓練成效不彰,新東家不想讓他繼續比賽。於是麥坤跟新東家老闆打了賭,他必須在佛羅里達500競賽裡得到冠軍。麥坤以自己的訓練方式進行訓練,Cruz 跟著他進行。他們一路到了韓大夫的老家,遇到了韓大夫的老伙伴們,從他們身上學到了不少技巧。然後他們趕赴佛羅里達參加比賽,但麥坤並沒有在訓練裡得到自信。在比賽的前半段,麥坤突然認知到該交棒了,身邊的 Cruz 正是一個奇才,於是換手讓 Cruz 跑。最後 Cruz 得到冠軍,麥坤也退居到總機械師的位置。

 

Python profiling decorator

前幾天想知道我 Django 程式裡某段函式的瓶頸,所以查了 Django 怎麼做 profiling 。是有查到有 jazzband/silk: Silky smooth profiling for Django 這個 package ,但是有點太大。如果是用常找到的

python -m cProfile xxx.py xxx.py

,Django 程式又不太適合。畢竟我只是想查某個函式而已。所以後來查到這兩個 decorator:

使用上很簡單,程式放進去,在想做 profiling 的函式前加上 decorator 就可以了。

我用的是第一個,在加上 decorator,執行過程式(應該說是瀏覽網頁)以後,在程式當前資料夾裡會找到 .profile 的檔案,為了後續方便說明,假設產生出來是 func.profile 。有這個檔案以後,就可以用

python -m pstats func.profile

開啟,開啟以後,是 pstats 的 shell ,一般要查哪個地方花的時間最多,會用

sort time

依照執行花費時間來排序,再用

stats 10

列出前十個花費時間最多的函式。

參考資料: