pythonのバージョンの切り替えで、困ったこと・迷ったこと


# 環境
>macbook air(13-inch,Early 2015)
Mac OS Monterey 12.6.3
python 3.9.0 → 3.10.4へ切り替え<br>
iMac Retina 5k, 27-inch, 2017
Mac OS Ventura 13.2
python 3.7.7 → 3.10.4へ切り替え
<br>selenium 4.8.2



# ネットで色々調べたが、中々答えが見つからずにてこずった。
> pyenvを使ってpythonのインストールをしていれば、バージョンの切り替えは簡単にできることはすぐにわかったものの、**切り替え前後に色々問題が発生**したので対処を記録しておきます。<br>
**（切り替える前の問題）**
①『Homebrew』から直接インストールしているpython3.9.0がインストールされている。このままpyenvをインストールしても、管理外でpythonが残ってしまう。
削除してもいいのだろうか？
***

>**（切り替え終了後に発生した問題）**
①pip listをしても何も入っていない！なぜ？<font color='red'>今までのPackageはどうした？</font>
```python 
~% pip list
Package    Version
---------- -------
pip        20.2.3
setuptools 49.2.1
```
>②selenium3以降は<font color='red'>記述方法</font>が変更になっていた。<br>
③GoogleChromeのウインドウが、<font color='red'>programのrun終了と同時にすぐにウインドウがClose</font>してしまう！！

など問題が続発したので、記録しておきます。
***

>なお、pyenv・pythonのインストール・バージョン切り替えについては下記のwebを参照に実施してスムーズに完了しました。感謝します。


https://proengineer.internous.co.jp/content/columnfeature/22312

# 発生した問題と対処した内容
#### １、『Homebrew』から直接インストールしているpython3.9.0があることを確認して、単純にこれをアンインストールすれば良いらしい。

> brewにあるかどうか確認のところあった。
```python
~ % brew list
autoconf	git		pkg-config	readline	xz
gdbm		openssl@1.1	python@3.9	ruby-build
gettext		pcre2		rbenv		sqlite
```
> brewからpythonをアンインストールする
```python
~ % brew uninstall python3
Uninstalling /usr/local/Cellar/python@3.9/3.9.0_2... (4,647 files, 74.7MB)
```
なんてことはなかった。

## ２、pyenvは今まで使ってない。
>このwebサイトを参考にpyenvとpythonのインストールをしました。<br>**全てスムーズに出来て私的には、大変参考になりました。**

https://proengineer.internous.co.jp/content/columnfeature/22312


## ３、ここからが本題です。

>色々と作った自作のProgramを実行すると、エラー続発です。
**(その１)モジュールがない：No module named 'package名'が続出**

```python
〜 % 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を表示してみたところ・・・
なんと、何もない！！

```python
~ % pip list
Package    Version
---------- -------
pip        21.2.3
setuptools 57.4.0
```
><font color='red'>この状態が正常なのか、いろいろなwebサイトをググりました</font>が、なかなか見つかりませんでした。
散々探した挙句、**唯一これに触れたYouTube**が見つかりました。
**pythonの複数のversionは独立しているので、pipでインストールしたライブラリも
独立して存在する。一つのversionでライブラリをインストールしても、他のversionでは、未インストールということになる。**
ということでした。YouTubeの最後の最後に出てきました。正常ということがわかり安心しました。<br>一般的には当たり前のことだからサイトも無いのかもしれませんが、初心者には”正常”と言うお墨付きはありがたいものです。

https://www.youtube.com/watch?v=4QbXFQMKnjs

>そこで地道に自作のprogramを実行しては、<font color="red">「ModuleNotFoundError: No module named〜〜」</font>が出現する都度、PIPでpackageをインストールしました。<br>
その中で、始めてすぐに<font color='red'>次のようなError</font>が出ました。


~ % *python3 -m pip install bs4
Collecting bs4
== 割愛　==
  Downloading soupsieve-2.4-py3-none-any.whl (37 kB)
Installing collected packages: soupsieve, beautifulsoup4, bs4
  <font color='magenta'>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</font>*
(非推奨: bs4 は従来の 'setup.py install' メソッドを使用してインストールされています。これは、'pyproject.toml' がなく、*'wheel' パッケージがインストールされていない*ためです。 pip 23.1 では、この動作の変更が強制されます。
可能な代替手段は、'--use-pep517' オプションを有効にすることです。 ディスカッションは https://github.com/pypa/pip/issues/8559 にあります。)

>結局、念のために今までインストールしたpackageをアンインストールしてからやり直しました。<br>（私の経験からですが）**まず最初**にpipのpackageの<font color='red'>"wheel"</font>を（~% python3 -m pip install wheel）をpipでインストールしてから、その他のpackageをインストールするのが良いと思いました。
ちなみに"wheel"packageとは<font color='blue'>*Pythonで利用されるZIPフォーマットのアーカイブファイルのことで拡張子はwhl。オフライン環境でパッケージインストールを行う際などに使用する。*</font>とのことです。

>**（その２）<font color='red'>[「AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'」</font>とエラーがでる。**
これについては、selenium３以降に記述方法が変更になったとだけのことだったので、地道に自作のprogramを実行しては修正をしました。（地道にpackageのupdateをしていればもっと早く気がついていたのにと後悔）

例えば
from selenium.webdriver.common.by import By  <---以前からあると思います。
（現　状）driver.find_element<font color="red">_by_xpath(</font>xpath_X)
（修正後）driver.find_element<font color="red">(By.XPATH,</font>xpath_X)
のように修正して解決

**（その3）最後にこれが１番の問題でした。**
<font color="red">GoogleChromeのウインドウ開いてもが、programのrun終了と同時にすぐにCloseしてしまう。</font>問題です。<br>なにしろ、以前のバージョン（3.9.0）では正常に稼働していたprogramが、切り替え後できなくなったのです。<br>色々webサイトを漁りましたが、見つかりませんでした。「ChromeDriver起動時にdetachオプションを設定」とかはありましたが、効果はありませんでした。<br>あきらめかけていたところで**「shobota」さんの【Python】Seleniumでブラウザを開いたまま処理を終了する - Qiit**が見つかりました。<br>原因はわかりませんがこの修正で問題は解決しました。

https://qiita.com/shobota/items/5324ca810b3848c4fd0f


具体的には、以下を追加

```python 
import os
import signal
try:
# ～いろいろな処理～
finally:
os.kill(driver.service.process.pid,signal.SIGTERM)
```

これにより、**GoogleがCloseしない他に、<font color='red'>メモリに残ったGoole関連のプロセスが、Googleを終了すると同時に、削除される**ようになりました。これは助かりました。

**Google実行直後のメモリの状況**
![実行直後 2023-02-21 9.01.42.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/edcd82cd-35b9-60dd-5e49-fd115cdb2f1a.png)

**GoogleをClose後のメモリの状況**
![Close後 2023-02-21 9.06.58.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/aa5f1710-09e2-0df7-654d-ed53ac1b3cab.png)

以上、諸問題を解決して無事にバージョンの切り替えは成功しました。