このページの応用です。
Windows側
pyinstaller(release)を使って実行ファイル(exe)を作ってみます。
但し、この方法が使えるのは、Python2.7、3.3~3.6までです。
2019/03/15現在、AnacondaのPythonは3.7です。3.6はconda createで別環境につくりましょう。
Anaconda Promptで以下実行
1 2 3 4 |
>conda create <span class="nt">-n</span> py36 <span class="nv">python</span><span class="o">=</span>3.6 anaconda >conda activate py36 抜ける場合 >conda deactivate |
注:3.7でもいけるかも…..まだ試していないけど->GitHub
Anacoda Promptを開いて、pyinstallerをインストール
>pip install pyinstaller
DOSPromptを開いてipconfigでローカルIPアドレスを調べておきます。
こんな感じ。
192.168.0.xx
実行ファイル作成用にフォルダー(例:py_work)を作っておきます。
1 |
C:¥Users¥USER¥py_work |
ここにPythonのコードファイルを置きます。
例:TkinterでGUIを作って待ち受け。
メッセージを受けとったら表示、メッセージがURLの場合はWindows側でブラウザーを開いてページを表示します。
【gui_waiting.py】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#!/usr/bin/env python # -*- coding: utf8 -*- import tkinter from tkinter import ttk import socket import threading PORT = 51000 MAX_MESSAGE = 2048 NUM_THREAD = 4 Guiroot = tkinter.Tk() Guiroot.title(u"information panel") Guiroot.geometry("350x400+100+50") var1 = tkinter.StringVar() def com_receive(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #ローカルIPを取得(有線LANのPCの場合) #スマホやラズパイのようなWi-Fi環境ではipgetなどを使います ip_info = socket.gethostbyname_ex(socket.gethostname()) ip_list = ip_info[2] for x in ip_list: ip = x octet_list = ip.split(".") if(int(octet_list[2]) == 0): ip_address = ip break sock.bind ((ip_address, PORT)) sock.listen (NUM_THREAD) #print ('receiver ready, NUM_THREAD = ' + str(NUM_THREAD)) while True: try: conn,addr = sock.accept() mess = conn.recv(MAX_MESSAGE).decode('utf-8') conn.close() message('MESSAGE:' + mess) except: print('Error') sock.close() def message(mes): var1.set(mes) def com_start(): th=threading.Thread(target=com_receive) th.start() frame1 = ttk.Frame( Guiroot, padding=5) frame1.grid() #このラベルに表示 label1 = tkinter.Label( frame1, anchor="nw", font=('Helvetica', '20'), width=40, height=20, foreground="#ff0000", background='#000000', textvariable=var1) label1.grid(row=2,column=1) com_start() Guiroot.mainloop() |
実行ファイル作成
onefileオプションを付けることで、ライブラリーを取り込んだ単体の実行ファイル(exe)が作成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
>pyinstaller gui_waiting.py --onefile アイコンを変える場合は >pyinstaller gui_waiting.py --onefile --icon=xxx.ico (即は反映しません、どのタイミングかは忘れてしまいましたが....) コンソールウィンドウも出さないようにするには >pyinstaller gui_waiting.py --onefile --icon=xxx.ico --windowed ただし、こうするとXボタンで閉じてもコンソールウィンドウのプロセスは残ります。 プロセスを全部落とす場合は、Xボタンに以下のような終了シークエンスを割り当てます。 import os def quit(): Guiroot.quit() Guiroot.destroy() os._exit(0) Guiroot.protocol('WM_DELETE_WINDOW', quit) |
gui_waiting.exeが直下のdistフォルダーに作成されます。
起動後、通信を待ち受けます
ラズパイ側
【send.py】
HOSTのxxはWindows側のローカルIPのxxで置き換え
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#!/usr/bin/env python3 # -*- coding: utf8 -*- import socket HOST = '192.168.0.<span style="color: #ff0000;"><strong>xx</strong></span>' PORT = 51000 def com_send(mess): while True: try: # 通信の確立 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((HOST, PORT)) # メッセージ送信 sock.send(mess.encode('utf-8')) # 通信の終了 sock.close() break except: print ('retry: ' + mess) break if __name__ == "__main__": com_send("こんちは") |
こんな感じ。
当たり前ですが、64bit環境で作ったものは32bitでは動きません。
それぞれ別個に作成します。
Pythonコードファイルは、UTF-8 BOM無しで保存すること。
常駐化しておけば、ターゲットを絞ったプッシュ通知のような機能にもなります。
ここではTCPを使ったユニキャストで行っています、UDPを使った1対多のマルチキャストの場合はこのページ参照。
Leave a Reply