Symfoware

Symfowareについての考察blog

Python Windows で serve_foreverの実行がCtrl + Cで停止しない

例えばこんなプログラム。


  1. # -*- coding:utf-8 -*-
  2. import BaseHTTPServer
  3. import SimpleHTTPServer
  4. server_address = ('', 8000)
  5. handler = SimpleHTTPServer.SimpleHTTPRequestHandler
  6. httpd = BaseHTTPServer.HTTPServer(server_address, handler)
  7. httpd.serve_forever()




実行後、ブラウザで「http://localhost:8000/」にアクセスすると、
実行しているディレクトリの内容が表示されます。


Windowsで実行時、プログラムをCtrl + Cで停止しようとしても止まってくれない。

Stopping python using ctrl+c

ここを参考に、Ctrl + Breakで停止できました。


テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/01/26(木) 00:01:36|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Python YouTubeの動画をダウンロード(pytube,Pafy)

PythonでYouTubeの動画をダウンロードする方法を調べたところ、
pytubeとPafyというライブラリが有名なようです。

両方触ってみます。




pytube



こちらを参考にしました。
PythonでYouTubeの動画を自動的に検索ダウンロードする

ソースはこちら。
https://github.com/NFicano/pytube

easy_installでインストールしました。


# easy_install pytube




サンプルはこのようになります。


  1. # -*- coding:utf-8 -*-
  2. from pytube import YouTube
  3. yt = YouTube('https://www.youtube.com/watch?v=0E00Zuayv9Q')
  4. # ダウンロードできる形式を表示
  5. for video in yt.get_videos():
  6.     print video
  7. print '-' * 10
  8. # ファイル名を表示
  9. print(yt.filename)
  10. print '-' * 10
  11. # ダウンロードしたい形式を選択
  12. video = yt.get('mp4', '720p')
  13. # ダウンロードするファイル名を指定
  14. yt.set_filename('download_pytube')
  15. # ダウンロード実行
  16. video.download('./')




実行結果


# python sample.py
<Video: MPEG-4 Visual (.3gp) - 144p - Simple>
<Video: MPEG-4 Visual (.3gp) - 240p - Simple>
<Video: H.264 (.mp4) - 360p - Baseline>
<Video: H.264 (.mp4) - 720p - High>
<Video: VP8 (.webm) - 360p - N/A>
----------
PPAP(Pen-Pineapple-Apple-Pen Official)ペンパイナッポーアッポーペン/PIKOTARO(ピコ太郎)
----------




set_filenameでファイル名を指定していない場合は、元のファイル名
(yt.filenameで取得できた名称)で保存されました。



プログラムを記載しなくても、pytubeというコマンドに引数を指定することで
動画のダウンロードが行えます。


-e 動画形式[mp4]
-r 動画サイズ[720p]
-f ファイル名[down.mp4]
-p ダウンロードフォルダ[./Download]




mp4,720p,ファイル名down.mp4でダウンロードする場合はこんな感じになります。
※ファイルの拡張子は自動的に付与されるようです。


# pytube -e mp4 -r 720p -f down https://www.youtube.com/watch?v=0E00Zuayv9Q








Pafy



こちらを参考にしました。
pythonでyoutubeをナニするPafyがすごくべんり

ソースはこちら。
https://github.com/mps-youtube/pafy

easy_install でインストールしました。


# easy_install pafy




インストール後、importすると警告が表示されました。


>>> import pafy
WARNING:root:pafy: youtube-dl not found; falling back to internal backend.
This is not as well maintained as the youtube-dl backend.
To hide this message, set the environmental variable PAFY_BACKEND to "internal".




youtube-dlも合わせてインストールしておきました。


# easy_install youtube-dl





pytubeと同様のコードはこちら。


  1. # -*- coding:utf-8 -*-
  2. import pafy
  3. video = pafy.new('https://www.youtube.com/watch?v=0E00Zuayv9Q')
  4. # ダウンロードできる形式を表示
  5. for s in video.streams:
  6.     #print(s.resolution, s.extension, s.get_filesize(), s.url)
  7.     print(s.resolution, s.extension)
  8. print '-' * 10
  9. # ファイル名を表示
  10. print(video.title)
  11. print '-' * 10
  12. # 指定した形式で、一番高画質なものを選択
  13. best = video.getbest(preftype="mp4")
  14. print(best.resolution, best.extension)
  15. # ダウンロード
  16. best.download(filepath="./")




pytubeと同様、ytdlコマンドで操作が可能です。

とにかく一番よい画質の動画をダウンロードしたい場合


# ytdl -b "https://www.youtube.com/watch?v=0E00Zuayv9Q"





形式を指定してダウンロードしたい場合は一旦ストリームの情報を取得
※引数はyoutbueのURLのvパラメーター


# ytdl 0E00Zuayv9Q
Stream Type    Format Quality         Size            
------ ----    ------ -------         ----            
1     normal 3gp    [176x144]        0 MB        
2     normal 3gp    [320x180]        1 MB        
3     normal webm [640x360]        5 MB        
4     normal mp4    [640x360]        4 MB        
5     normal mp4    [1280x720]     10 MB        
6     audio m4a    [128k]         1 MB




ストリームの番号を指定してダウンロードします。
以下の指定で、4番(640x360のmp4)をダウンロード。


# ytdl -n4 0E00Zuayv9Q





【参考URL】

PythonでYouTubeの動画を自動的に検索ダウンロードする

https://github.com/NFicano/pytube

pythonでyoutubeをナニするPafyがすごくべんり

https://github.com/mps-youtube/pafy


テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/01/23(月) 23:55:46|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

OpenCV 3.2をDebian 8にインストールする

OpenCV
2017.1.22時点で最新版の3.2をDebian 8にインストールしてみます。



インストールスクリプト



ソースからビルドしてインストールします。
・・・が依存しているライブラリが多く、インストールは結構面倒なようです。

調べてみると、親切な方がインストールスクリプトを公開してくださっています。
http://milq.github.io/install-opencv-ubuntu-debian/

これを使わせていただくことにしました。


まず、実行に必要なライブラリをインストール。


# apt-get install sudo wget




apt版のopencvがインストールされている場合は、事前に削除しておきます。


# apt-get autoremove libopencv-dev python-opencv




インストールスクリプトをダウンロードして実行。


# cd /usr/local/src/
# wget --no-check-certificate https://raw.githubusercontent.com/milq/scripts-ubuntu-debian/master/install-opencv.sh
# chmod +x install-opencv.sh
# ./install-opencv.sh



これでインストール完了です。
※私の環境では、インストールに20分程度必要でした




Pythonから呼び出しとバージョン確認



Python2からcv2をインポート。
バージョンを確認してみます。


# python
Python 2.7.9 (default, Jun 29 2016, 13:08:31)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'




Python3も同様に試してみます。


# python3
Python 3.4.2 (default, Oct 8 2014, 10:45:20)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'




ちゃんとインポートできていますね。


テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/01/22(日) 22:40:15|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

JenkinsのパラメータージョブをPythonでリモートから実行する

PythonでJenkinsのジョブが実行できるようになりました。
JenkinsのジョブをPythonでリモートから実行する

パラメーターを指定してのジョブ実行を試してみます。


ジョブの編集



「target_id」というパラメーターを追加しました。

699_01.png


シェルスクリプトでは、受け取ったパラメーターを表示するよう変更しています。

699_02.png


ここで指定された値を実行に時間のかかるジョブに渡す想定です。





Pythonプログラム



パラメーター付きのジョブを実行する際は、
「job/[job名]/buildWithParameters」
にGETリクエストを送信します。

「要因」の項目にもデータを送るサンプルはこのようになりました。



  1. # -*- coding:utf-8 -*-
  2. import urllib2, base64, urllib
  3. build_param = {}
  4. build_param['token'] = u'sample_token'
  5. build_param['target_id'] = '日本語パラメーター'
  6. build_param['cause'] = 'ここが要因'
  7. data = urllib.urlencode(build_param)
  8. # URLは[jenkins]/[ジョブ名]/buildWithParameters
  9. url = 'http://192.168.1.102:8080/job/test-job/buildWithParameters'
  10. # 設定画面で表示されたユーザID、APIトークンでベーシック認証
  11. username = 'symfo'
  12. password = 'eb6d158c477b8f8f700d54c2d9c6dc12'
  13. request = urllib2.Request(url + '?' + data)
  14. # http://stackoverflow.com/questions/2407126/python-urllib2-basic-auth-problem
  15. # You need the replace to handle encodestring adding a trailing newline
  16. # (https://docs.python.org/2/library/base64.html#base64.encodestring)
  17. base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
  18. request.add_header("Authorization", "Basic %s" % base64string)
  19. result = urllib2.urlopen(request)




ちゃんとパラメーターが送信できました。
日本語でも問題ありません。

699_03.png

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/06/29(水) 00:50:51|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

JenkinsのジョブをPythonでリモートから実行する

処理に時間のかかるバッチプログラムをJenkinsのジョブとして定義。
クライアントからはそのジョブを起動する処理を書いて、すぐに処理を終了させる。
なんてことができないか調べてみました。


最初にうまく行かなかった方法を記載しておきます。


JenkinsのAPI Token



Jenkins 2.11のジョブを実行してみます。
まず、API Tokenを取得する必要があるようです。

ログインした状態で、設定画面を開きます。

698_01.png


画面の中央辺りに、「APIトークンの表示」というボタンがあるのでクリック。

698_02.png


ここにユーザーIDとAPIトークンが表示されます。

698_03.png





ジョブの作成



「test-job」というジョブを作成。
内容は、文字列をechoするだけです。

698_04.png

698_05.png


これを別端末からPythonで実行してみます。




Pythonのサンプルプログラム



job/[jobの名称]/buildにpostすれば動くとのことだったので、こんなプログラムを作成しました。

※このプログラムは動作しません。


  1. # -*- coding:utf-8 -*-
  2. import urllib2
  3. import json
  4. # URLは[jenkins]/[ジョブ名]/build
  5. url = 'http://192.168.1.102:8080/job/test-job/build'
  6. # 設定画面で表示されたAPIトークン
  7. password = 'eb6d158c477b8f8f700d54c2d9c6dc12'
  8. # POSTする値はtoken?
  9. data = {
  10.     'token' : password
  11. }
  12. request = urllib2.Request(url, data=json.dumps(data))
  13. request.get_method = lambda: 'POST'
  14. # job実行
  15. response = urllib2.urlopen(request)
  16. ret = response.read()
  17. print 'Response:', ret
  18. print 'ok'




実行するとこんなエラーが。


Traceback (most recent call last):
File "jenkins.py", line 22, in <module>
    response = urllib2.urlopen(request)
File "/usr/lib/python2.7/urllib2.py", line 154, in urlopen
    return opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 435, in open
    response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 548, in http_response
    'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 473, in error
    return self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 407, in _call_chain
    result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 556, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: No valid crumb was included in the request








ビルド・トリガのリモートからビルド



諦めかけていた時、改めてジョブの設定画面を見てみると、
「リモートからビルド」の設定を見つけました。

698_06.png



リモートからビルドを実行するには次のURLを使用します:

JENKINS_URL/job/test-job/build?token=TOKEN_NAME
もしくは、
/buildWithParameters?token=TOKEN_NAME

&cause=要因を追加する(オプション)と、ビルドを実行した要因として記録することができます。




認証トークンに適当な文字列を入力して保存します。

698_07.png


ユーザーIDとAPIトークンはベーシック認証で指定します。
Python標準機能だとうまく認証が通過できなかったので、

Python urllib2 Basic Auth Problem
こちらを参考に、自分でヘッダーに情報を書き込みます。


  1. # -*- coding:utf-8 -*-
  2. import urllib2, base64
  3. # URLは[jenkins]/[ジョブ名]/build
  4. url = 'http://192.168.1.102:8080/job/test-job/build?token=sample_token'
  5. # 設定画面で表示されたユーザID、APIトークンでベーシック認証
  6. username = 'symfo'
  7. password = 'eb6d158c477b8f8f700d54c2d9c6dc12'
  8. request = urllib2.Request(url)
  9. # http://stackoverflow.com/questions/2407126/python-urllib2-basic-auth-problem
  10. # You need the replace to handle encodestring adding a trailing newline
  11. # (https://docs.python.org/2/library/base64.html#base64.encodestring)
  12. base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
  13. request.add_header("Authorization", "Basic %s" % base64string)
  14. result = urllib2.urlopen(request)




プログラムを実行すると、リモートからジョブが実行できました。

698_08.png

698_09.png


テーマ:サーバ - ジャンル:コンピュータ

  1. 2016/06/29(水) 00:19:48|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
前のページ 次のページ