環境
macbook air(13-inch,Early 2015)
Mac OS Monterey 12.6.3
python 3.9.0 → 3.10.4へ切り替え
iMac Retina 5k, 27-inch, 2017
Mac OS Ventura 13.2
python 3.7.7 → 3.10.4へ切り替え
selenium 4.8.2
ネットで色々調べたが、中々答えが見つからずにてこずった。
pyenvを使ってpythonのインストールをしていれば、バージョンの切り替えは簡単にできることはすぐにわかったものの、切り替え前後に色々問題が発生したので対処を記録しておきます。
(切り替える前の問題)
①『Homebrew』から直接インストールしているpython3.9.0がインストールされている。このままpyenvをインストールしても、管理外でpythonが残ってしまう。
削除してもいいのだろうか?
(切り替え終了後に発生した問題)
①pip listをしても何も入っていない!なぜ?今までのPackageはどうした?
~% pip list
Package Version
---------- -------
pip 20.2.3
setuptools 49.2.1
②selenium3以降は記述方法が変更になっていた。
③GoogleChromeのウインドウが、programのrun終了と同時にすぐにウインドウがCloseしてしまう!!
など問題が続発したので、記録しておきます。
なお、pyenv・pythonのインストール・バージョン切り替えについては下記のwebを参照に実施してスムーズに完了しました。感謝します。
発生した問題と対処した内容
1、『Homebrew』から直接インストールしているpython3.9.0があることを確認して、単純にこれをアンインストールすれば良いらしい。
brewにあるかどうか確認のところあった。
~ % brew list
autoconf git pkg-config readline xz
gdbm openssl@1.1 python@3.9 ruby-build
gettext pcre2 rbenv sqlite
brewからpythonをアンインストールする
~ % brew uninstall python3
Uninstalling /usr/local/Cellar/python@3.9/3.9.0_2... (4,647 files, 74.7MB)
なんてことはなかった。
2、pyenvは今まで使ってない。
このwebサイトを参考にpyenvとpythonのインストールをしました。
全てスムーズに出来て私的には、大変参考になりました。
3、ここからが本題です。
色々と作った自作のProgramを実行すると、エラー続発です。
(その1)モジュールがない:No module named 'package名'が続出
〜 % python3 main.py
Traceback (most recent call last):
File "/Users/xxxxxxxx/Library/Mobile Documents/com~apple~CloudDocs/_program_ver3100/news2/main.py", line 7, in <module>
from bs4 import BeautifulSoup as bs
ModuleNotFoundError: No module named 'bs4'
モジュールがないと言うことなので。pip listを表示してみたところ・・・
なんと、何もない!!
~ % pip list
Package Version
---------- -------
pip 21.2.3
setuptools 57.4.0
この状態が正常なのか、いろいろなwebサイトをググりましたが、なかなか見つかりませんでした。
散々探した挙句、唯一これに触れたYouTubeが見つかりました。
pythonの複数のversionは独立しているので、pipでインストールしたライブラリも
独立して存在する。一つのversionでライブラリをインストールしても、他のversionでは、未インストールということになる。
ということでした。YouTubeの最後の最後に出てきました。正常ということがわかり安心しました。
一般的には当たり前のことだからサイトも無いのかもしれませんが、初心者には”正常”と言うお墨付きはありがたいものです。
そこで地道に自作のprogramを実行しては、「ModuleNotFoundError: No module named〜〜」が出現する都度、PIPでpackageをインストールしました。
その中で、始めてすぐに次のようなErrorが出ました。
~ % python3 -m pip install bs4
Collecting bs4
== 割愛 ==
Downloading soupsieve-2.4-py3-none-any.whl (37 kB)
Installing collected packages: soupsieve, beautifulsoup4, bs4
DEPRECATION: bs4 is being installed using the legacy 'setup.py install' method, because it does not have a 'pyproject.toml' and the 'wheel' package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to enable the '--use-pep517' option. Discussion can be found at https://github.com/pypa/pip/issues/8559
(非推奨: bs4 は従来の 'setup.py install' メソッドを使用してインストールされています。これは、'pyproject.toml' がなく、'wheel' パッケージがインストールされていないためです。 pip 23.1 では、この動作の変更が強制されます。
可能な代替手段は、'--use-pep517' オプションを有効にすることです。 ディスカッションは https://github.com/pypa/pip/issues/8559 にあります。)
結局、念のために今までインストールしたpackageをアンインストールしてからやり直しました。
(私の経験からですが)まず最初にpipのpackageの"wheel"を(~% python3 -m pip install wheel)をpipでインストールしてから、その他のpackageをインストールするのが良いと思いました。
ちなみに"wheel"packageとはPythonで利用されるZIPフォーマットのアーカイブファイルのことで拡張子はwhl。オフライン環境でパッケージインストールを行う際などに使用する。とのことです。
(その2)[「AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'」とエラーがでる。
これについては、selenium3以降に記述方法が変更になったとだけのことだったので、地道に自作のprogramを実行しては修正をしました。(地道にpackageのupdateをしていればもっと早く気がついていたのにと後悔)
例えば
from selenium.webdriver.common.by import By <---以前からあると思います。
(現 状)driver.find_element_by_xpath(xpath_X)
(修正後)driver.find_element(By.XPATH,xpath_X)
のように修正して解決
(その3)最後にこれが1番の問題でした。
GoogleChromeのウインドウ開いてもが、programのrun終了と同時にすぐにCloseしてしまう。問題です。
なにしろ、以前のバージョン(3.9.0)では正常に稼働していたprogramが、切り替え後できなくなったのです。
色々webサイトを漁りましたが、見つかりませんでした。「ChromeDriver起動時にdetachオプションを設定」とかはありましたが、効果はありませんでした。
あきらめかけていたところで**「shobota」さんの【Python】Seleniumでブラウザを開いたまま処理を終了する - Qiit**が見つかりました。
原因はわかりませんがこの修正で問題は解決しました。
具体的には、以下を追加
import os
import signal
try:
# ~いろいろな処理~
finally:
os.kill(driver.service.process.pid,signal.SIGTERM)
これにより、GoogleがCloseしない他に、メモリに残ったGoole関連のプロセスが、Googleを終了すると同時に、削除されるようになりました。これは助かりました。
以上、諸問題を解決して無事にバージョンの切り替えは成功しました。