Yi3112Yi3112
@Yi3112Yi3112

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

[selenium] PyInstallerで作成したexe実行時のエラー

エラー内容は以下のとおりです。

ModuleNotFoundError: No module named 'selenium'

◆conda listではseleniumの存在確認済み
◆ChromeWebdriverのexeの在り処はフルパスで指定

どうすれば解決できますでしょうか。
ご教授お願い致します。

0

2Answer

もしchromedriver.exeも含めて 1個のexeを作成するのであれば
以下の手順で実施してみていただけませんか。

shell
ファイルが存在する場所
c:\tools\test.py        ・・pythonモジュール本体
c:\tools\lib\chromedriver.exe ・・chromedriver.exe

exeの作成方法
cd c:\tools
pyinstaller --onefile --add-binary "c:\tools\lib\chromedriver.exe";"." --hidden-import selenium test.py

onefile;生成するファイルを 1個にまとめる
add-binary;外部ファイルのchromedriver.exeも生成するexeに含める
hidden-import;seleniumモジュールもexeに含める

1Like

Comments

  1. @Yi3112Yi3112

    Questioner

    解消されました!ありがとうございました!
    ただ、また別のエラーが出てしまいまして。
    TypeError:__init__got an unexpected keyword argument 'service'
    ※Chromedriverのパス指定の非推奨を解消するための処置を入れました。
  2. 解消してよかったです。

    新しいメッセージはソースコードと詳細エラーメッセージがないと
    発生している原因は特定できないものの
    selenium 3系を利用したために発生しているエラーと同じようです。

    selenium 4系にすれば解消するかもしれません。
    変更してみていただけませんか。

    参考;
    https://stackoverflow.com/questions/70993717/selenium-typeerror-init-got-an-unexpected-keyword-argument-service
    https://stackoverflow.com/questions/70534875/typeerror-init-got-an-unexpected-keyword-argument-service-error-using-p/70537951#70537951
  3. @Yi3112Yi3112

    Questioner

    seleniumは4.8.3が入っていました・・・
    ちなみにソースコードは以下となります。

    from selenium.webdriver.chrome.service import Service

    service = Service(executable_path="C:/Users/~/chromedriver.exe")
    Driver = webdriver.Chrome(service=service)
    Driver.get(Url)
  4. 以下のどちらかで解消しそうな気がします。やってみていただけませんか。

    from selenium import webdriver
    driver = webdriver.Chrome(executable_path="c:/path/to/chromedriver.exe")
    driver.get(url)

    ないし
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service

    service = Service(executable_path="c:/path/to/chromedriver.exe")
    options = webdriver.ChromeOptions()
    options.service = service
    driver = webdriver.Chrome(options=options)
    driver.get(url)
  5. ありがとうございます。パラメタが少し変化しているようです。

    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service

    service = Service(executable_path="c:/path/to/chromedriver.exe")
    options = webdriver.ChromeOptions()
    options.service_args = service    ・・・★
    driver = webdriver.Chrome(options=options)
    driver.get(url)

    参考;
    https://stackoverflow.com/questions/47283378/what-are-service-args-for-the-selenium-python-chrome-webdriver
  6. なんと。
    最後のエラーメッセージは PATH が通っていないことが原因となります。

    service = Service(executable_path="C:/Users/~/chromedriver.exe")

    上記のパスに英数字以外(漢字とか)が含まれる可能性はありませんか・・★

    c:/tools/lib/chromedriver.exe など環境に依存しない場所であれば
    動きそうです。あるいは Windowsならば環境変数の PATH に
    chromedriver.exeが存在する場所を追加してもよいかもしれません。

    最新の記述で動作するのであれば、あとは PATH さえ通れば動きそうです
  7. @Yi3112Yi3112

    Questioner

    以下、教えていただいた内容で記述して、PATHは通っているようです。
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service as ChromeService
    from selenium.webdriver.chrome.options import Options

    options = webdriver.ChromeOptions()
    service =ChromeService(executable_path="C:/tools/lib/chromedriver.exe")
    options.service_args = service
    Driver = webdriver.Chrome(service = service,options = options)
    Driver.get(Url)
    ※chromedriver.exeのパスに英数字以外は含まれていません
    ※環境変数の追加も行いました

    やっぱりまだ「TypeError:__init__got an unexpected keyword argument 'service'」が出てきます...。難しい事象ですね...
  8. @Yi3112Yi3112

    Questioner

    すみません、コメントに不足がありました。
    driver = webdriver.Chrome(options=options)
    で実行すると
    'chromedriver' executable needs to be in PATH
    のエラーが出たので、service = serviceを追加したところ
    正常に実行できた、という経緯でした。
  9. おはようございます。以下で確認できました。
    設定は正しく実行時のPATHにchromedriver.exeが含まれないのが
    原因のように思われます。

    こちらもseleniumは 4.8.3を利用しています。

    -- ソースコード --
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service

    service = Service(executable_path="C:\tools\lib\chromedriver.exe")
    options = webdriver.ChromeOptions()
    options.service_args = service
    driver = webdriver.Chrome(options=options)
    driver.get('https://www.google.com')

    -- exe 作成 --

    ファイルが存在する場所
    c:\tools\test.py        ・・pythonモジュール本体
    c:\tools\lib\chromedriver.exe ・・chromedriver.exe

    exeの作成方法
    (qiita) c:\tools> cd c:\tools
    (qiita) c:\tools> pyinstaller --onefile --add-binary "c:\tools\lib\chromedriver.exe";"." --hidden-import selenium test.py

    c:\tools\dist\ 配下にて test.exe が作成される

    -- 実行する --
    (qiita) c:\tools> cd c:\tools\dist
    (qiita) c:\tools\dist> test.exe

    Traceback (most recent call last):
    File "selenium\webdriver\common\service.py", line 72, in start
    File "subprocess.py", line 854, in __init__
    File "subprocess.py", line 1307, in _execute_child
    FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "test.py", line 7, in <module>
    File "selenium\webdriver\chrome\webdriver.py", line 73, in __init__
    File "selenium\webdriver\common\service.py", line 81, in start
    selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

    [23336] Failed to execute script 'test' due to unhandled exception!


    -- PATHの変更 --
    (qiita) c:\tools\dist> PATH=..\;%PATH%
    (qiita) c:\tools\dist> test.exe

    DevTools listening on ws://127.0.0.1:53158/devtools/browser/8f383ca8-3b16-4aab-b933-8d12a71be3db

    ※test.exe を chromedriver.exe と同じ場所に移動してもOKです。
  10. @Yi3112Yi3112

    Questioner

    ご返信遅れ大変失礼しました。
    いろいろ試してもダメだったので環境構築をまっさらにして
    一から構築してからリトライしたらうまくいきました!
    ごちゃごちゃして色々競合してたようです。
    親身にご相談に乗っていただき、ありがとうございました!

  11. よかった!正常動作してよかったです。ずっと気になっておりました。
    共有ありがとうございます。これからも頑張ってください🎅

  12. @Yi3112Yi3112

    Questioner

    挫折せずに済みました。
    ご親切にありがとうございました。

Your answer might help someone💌