質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PyInstaller

PyInstallerは、Pythonのスクリプトを一括でWindowsなどで動く実行可能ファイルに変換できるツールです。このツールを用いることで自作のPythonプログラムを別で使用する場合でもPythonをインストールする必要がありません。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

1回答

3765閲覧

seleniumのGUI化(pyinstaller)で配布

takugon92

総合スコア20

PyInstaller

PyInstallerは、Pythonのスクリプトを一括でWindowsなどで動く実行可能ファイルに変換できるツールです。このツールを用いることで自作のPythonプログラムを別で使用する場合でもPythonをインストールする必要がありません。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

2クリップ

投稿2020/06/11 02:44

編集2020/06/16 02:14

前提・実現したいこと

seleniumとtkinterなどを利用してプログラムを作り、GUI化しました。これを他人に配布したい

発生している問題・エラーメッセージ

まず、seleniumはchromedriverを利用しているのですが、それを組み込む際の--add-binaryで

python

1pyinstaller main.py --onefile --noconsole --add-binary "./driver/chromedriver.exe;./driver"

"元ファイルパス;取込先ファイルパス"とのことですが、取り込み先ファイルパスはdistの中という認識で会っていますでしょうか?

解決(2020/06/16)
取り込み先ファイルパスはdist/からの相対パス

次に、pandasでcsvファイルに書き出す、および読み込むことをしていますが、これは--add-dataで追加したらよいのでしょうか?

次に、python標準ライブラリ以外をインポートしている際どうしたらよいでしょうか?(今回はmojimoji)

現在のフォルダ構成は
C:\Users\ユーザー名\Documents\VScode
├ driver/
│ └ chromedriver.exe
├ data1.csv
└ main.py

で、webdriver及びpandasは

python

1driver = webdriver.Chrome(r'./driver/chromedriver.exe') 2pd = pd.read_csv('data1.csv')

としています。相対パスでは問題があるなどありますか?

pyinstallerの引数指定は、

cmd

1C:\Users\ユーザー名\Documents\VScode>pyinstaller main.py --onefile --noconsole --add-binary "./driver/chromedriver.exe;./driver" --add-data "data.csv;."

としてます。こうすると、
C:\Users\ユーザー名\Documents\VScode\dist
└ main.exe
になり、そのまま実行すると、

FileNotFoundError:File data1.csv does not exist: 'data1.csv'

となるので、

C:\Users\ユーザー名\Documents\VScode\dist
├ driver/
│ └ chromedriver.exe
├ data1.csv
└ main.exe

にすると自分のパソコンでは動いたのですが、配布すると、

ImportError: DLL load failed:指定されたモジュールが見つかりません

と出ます。これはエラーの場所からしてmojimojiだとわかりました。
pyinstallerを使うと、distのほかに、_pycache_やbuildができるが、配布する際は、distだけでいいのか。また上記の指定はあっているのか、ご教授いただけると幸いです

追加 
外部モジュール(mojimoji)のsite\packagesをバイナリに追加したらいいのかと思い、specファイルのbinariesに
binaryies = [('C.\Users\ユーザー名\~~~\mojimoji_init_.pyi','./mojimoji')]
などを追加し、実行してみると、配布する前のパソコンでは実行できたのですが、配布後のパソコンで

Traceback (most recent call last):
File "main.py", line 19, in <module>
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
[17400] Failed to execute script main

line 19 はimport mojimojiでやはり、外部ライブラリを認識していないようです。
その時のファイル構成は
C:\Users\ユーザー名\Documents\VScode\dist
├ driver/
│ └ chromedriver.exe
├ mojimoji/
│ ├ init.pyi
│ └py.typed
├ data1.csv
└ main.exe
です。

さらに追加
配布する前のパソコンで実行ができるのは,そのパソコンにmojimojiがインポートされているからだと分かりました
exeファイルに内包する方法をご存じの方,ご教授お願いします

補足情報(FW/ツールのバージョンなど)

selenium
python3
win10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

回答という訳ではありませんが、下記の環境で動作試験を行い動作しましたので報告します。

  • Windows 10
  • Anaconda (4.8.3)
  • Python 3.8.3
  • pandas 1.0.4 (conda install)
  • selenium 3.9.0 (conda install)
  • mojimoji 0.0.11 (pip install)
  • Chrome version 83
  • ChromeDriver 83.0.4103.39 (chromedriver_win32.zip)

テストコード

python

1import mojimoji 2import pandas as pd 3from selenium import webdriver 4 5 6def main(): 7 zenkaku = "カタカナ" 8 hankaku = mojimoji.zen_to_han(zenkaku) 9 print(hankaku) 10 11 df = pd.read_csv("data1.csv") 12 print(df) 13 14 driver = webdriver.Chrome("./driver/chromedriver.exe") 15 driver.get("https://www.google.com") 16 hello = input() 17 print(hello) 18 driver.quit() 19 20 21if __name__ == "__main__": 22 main()

pyinstaller実行時に行った特別なこと

hook-zmqが'utf-8' codec can't decode byteとエラーを出力したためstack overflowの投稿を参考にPython\Lib\site-packages\Pyinstaller\compat.pyを修正(2箇所)。

python

1#out.decode(encoding) 2out.decode(encoding, errors='ignore')

Anaconda Navigatorから起動したVSCodeからTerminalを起動し下記のコマンドを実行。--noconsoleは除いた。

cmd

1D:\TeraTail\work\pkg_test>set PYTHONUTF8=1 2D:\TeraTail\work\pkg_test>pyinstaller main.py --onefile --add-binary "./driver/chromedriver.exe;./driver" --add-data "data.csv;."

specファイル

python

1# -*- mode: python ; coding: utf-8 -*- 2 3block_cipher = None 4 5 6a = Analysis(['main.py'], 7 pathex=['D:\TeraTail\work\pkg_test'], 8 binaries=[('./driver/chromedriver.exe', './driver')], 9 datas=[('data1.csv', '.')], 10 hiddenimports=[], 11 hookspath=[], 12 runtime_hooks=[], 13 excludes=[], 14 win_no_prefer_redirects=False, 15 win_private_assemblies=False, 16 cipher=block_cipher, 17 noarchive=False) 18pyz = PYZ(a.pure, a.zipped_data, 19 cipher=block_cipher) 20exe = EXE(pyz, 21 a.scripts, 22 a.binaries, 23 a.zipfiles, 24 a.datas, 25 [], 26 name='main', 27 debug=False, 28 bootloader_ignore_signals=False, 29 strip=False, 30 upx=True, 31 upx_exclude=[], 32 runtime_tmpdir=None, 33 console=True )

試験方法

同一のPC上でAnacondaのパスが通っていないコマンドプロンプト上で実施。

terminal

1C:\Users\ユーザー名\Desktop\test 2├ driver/ 3│ └ chromedriver.exe 4├ data1.csv 5└ main.exe

投稿2020/06/22 13:29

yymmt

総合スコア1615

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takugon92

2020/06/24 02:17

回答ありがとうございます。 同様にしてやってみたのですが、配布先のパソコン(pythonを入れてないwin10)では動きませんでした コンソール上のエラーは Traceback (most recent call last): File "test_mojimoji.py", line 19, in <module> ImportError : DLL load failed: 指定されたモジュールが見つかりません。 [19972] Failed to execute script main です。 もう少し試行錯誤してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問