IT ニュース&コラム 2019/ 5/ 6 通巻787号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ■■ Windows で Python スクリプトを Python の仮想環境の中で起動する方法 ■■ 2012年にディープラーニングという方式の AI(人工知能)が他の方式の AI よりも 画像処理コンテストで圧倒的大差をつけて優勝したことで、ディープラーニングが 注目され始めました。 同時に、AIを使うときのプログラミング言語として Python がよく使われるようになりました。 元々 Python はAI用のプログラミング言語というわけではありませんでしたが、 おそらく記述が簡単な言語仕様であることから、AIの研究者は Python を使うように なりました。 また、Java のように、どのプラットフォーム(Windows, Linux など) でも使えるインタープリター型のプログラミング言語(スクリプト言語)としても 注目されています。 どのプラットフォームでも動くと言っていますが、だれでもすぐに動かせるとは 限りません。 たとえば、あるコードの実行に必要なライブラリ(Python モジュール)が インストールされていなければ、エラーになって動かせません。 スマホのアプリは、インストールのボタンをタップするだけで使えるようになりますが、 Linux のプログラムやスクリプトを実行するときは、実行方法が書かれた文書(手順書) を見ながら、シェル(コマンド プロンプト)にコマンドを入力していく必要があります。 この方法は、読み飛ばしや数字の間違いがあったら、動かせなくなる可能性があります。 インストールしようとする人が操作を間違うことがよくありますが、手順書自体が 間違っている可能性もあります。 書いた当時は正しかったけど、最新版では動かない こともあります。 動作確認したバージョンが書いてあるから手順書に間違いはない として保身することはできますが、印象は悪くなったりユーザーが減ったりします。 それを避けるには、スマホのアプリのようにインストールを全自動にしなければなりません。 また、前回のプロジェクトでインストールしたライブラリ(Python なら Python モジュール)が、今回のプロジェクトを実行するのに必要なライブラリであった場合、 そのライブラリをインストールすることを手順書に書き忘れる可能性もあります。 だから、別のPCでも動かすなど、テストをする必要があると考えると思いますが、 別のPCでもすでにライブラリがインストールされていたら、手順書のバグを検出でき ません。 必要なライブラリが不足する問題を解決するには、仮想環境を使います。 Python の仮想環境は、Docker のコンテナーと同じような特性があります。 それは、 ・アプリ実行環境構築の容易さ(ユーザーのメリット) ・設定間違いなどの不可逆的操作の廃棄の容易さ(開発者のメリット) です。 Python の仮想環境は、その中にインストールされた Python インタープリターや ライブラリが、他の仮想環境にインストールされたものから隔離されています。 つまり、ある仮想環境にあるライブラリをインストールしたとしても、他の仮想環境 で実行すると、ライブラリがインストールされていないものとしてエラーになります。 Python をインストールしてそのままスクリプトを実行したときは、 インストールしたフォルダーがデフォルトの仮想環境であるかのように、 他の仮想環境から隔離されて実行します。 新しい仮想環境を作ると、標準ライブラリだけがインストールされた環境ができます。 標準ライブラリの構成は、Python のバージョンによって異なりますが、インストール する Python のバージョンを間違えない限り、どのプラットフォームでも全く同じ ライブラリの構成になります。 よって、新しい仮想環境を作ってからライブラリをインストールするような手順書に すれば、必要なライブラリが不足する問題は発生しません。 これが、「アプリ実行環境 構築の容易さ」です。 全自動で新しい仮想環境を作ってライブラリをインストールすれば もっと容易になるのですが、多くの場合、書いてある通りに操作してもうまくいかない ことを難しいと感じます。全自動でもインストールでエラーになれば難しいと感じます。 Python の仮想環境は1つのフォルダーにまとまっています。 仮想環境を削除したければ、 そのフォルダーを削除すだけです。 仮想環境のバックアップやリストアをしたければ、 フォルダーのコピーをするだけです。 これが、「設定間違いなどの不可逆的操作の 廃棄の容易さ」です。 テスト仕様書やテストスクリプトには、仮想環境を削除してからインストールするように 書きます。 全自動で新しい仮想環境を作ってライブラリをインストールして Python スクリプトを 起動するバッチファイルを公開します。 // Make a python virtual environment のコメントがある部分で新しい仮想環境を作り、 // Install related python modules のコメントがある部分でライブラリ(Python モジュール)をインストールしています。 2回目の実行では、仮想環境のフォルダーやライブラリがすでにあるために、 新しい仮想環境の作成やライブラリのインストールはスキップされ、早くスクリプトを 起動します。 バッチファイルの内容をテキストエディターで開いて、一時的に g_InstallingIsEnabled=%False% にするとさらに高速に起動します。 ただし、 ライブラリを追加インストールしなくなるため、ライブラリをインストールするコードを バッチファイルに書いたのにインストールされないという問題に遭遇するので注意して ください。 参考: https://docs.python.org/ja/3/using/windows.html?highlight=virtualenv#virtual-environments https://virtualenv.pypa.io/en/latest/ @echo off rem ******************************************************************** rem * File: ExampleOfPIP.bat rem ******************************************************************** rem // Constant set True=0 set False=1 rem // Setting rem //================================================================== set g_PythonFile=Hello_Python_3.py set g_PythonVersion=3.7.2 set g_PythonBit=64 rem // 64 or 32 set g_VirtualEnvironmentName=scriptlib set g_InstallingIsEnabled=%True% rem // True or False rem //================================================================== rem ******************************************************************** rem * Function: Main rem * rem * Return Value: rem * %errorlevel% - 0=Pass rem ******************************************************************** :Main call :SetVariables "%~0" call :MainTry & call :MainFin & goto :eof :MainTry set python_version_123=%g_PythonVersion:.=% call :gs_CutPatchVersionNumber "%g_PythonVersion%" set python_version_1_2=%return_value% if "%g_PythonBit%" == "32" ( set python_version_12=%python_version_1_2:.=%-32 ) else ( set python_version_12=%python_version_1_2:.=% ) set base_python_path=%USERPROFILE%\AppData\Local\Programs\Python\Python%python_version_12% set python_path=%USERPROFILE%\AppData\Local\Programs\Python\Python%python_version_12%_%g_VirtualEnvironmentName% rem // Guard if not exist "%base_python_path%" ( echo Windows x86-64 executable installer echo https://www.python.org/downloads/release/python-%python_version_123%/ echo Uncheck "Add Python %python_version_1_2% to PATH" when you install Python echo. call :Error 1 "Not found Python %g_PythonVersion% in %base_python_path%." exit /b ) rem // Make a python virtual environment set base_pip_exe=%base_python_path%\Scripts\pip.exe set base_virtualenv_exe=%base_python_path%\Scripts\virtualenv.exe if not exist "%python_path%" ( echo Making a python virtual environment ... "%base_pip_exe%" install virtualenv & if errorlevel 1 ( exit /b ) "%base_virtualenv_exe%" "%python_path%" & if errorlevel 1 ( exit /b ) set g_InstallingIsEnabled=%True% ) rem // Install related python modules if not "%g_InstallingIsEnabled%" == "%True%" goto end_if_1 pushd "%python_path%\Scripts" & if errorlevel 1 ( exit /b ) rem // Install tbvaccine pip install tbvaccine & if errorlevel 1 ( exit /b ) & rem // call stack viewer pip install colorama & if errorlevel 1 ( exit /b ) & rem // colored terminal text popd :end_if_1 echo. echo Successfully installed. echo Starting python script... echo. rem // Start python script echo on start "" "%python_path%\Scripts\python.exe" "%g_PythonFile%" @echo off if "%g_InstallingIsEnabled%" == "%True%" ( echo End of script. if "%no_error_pause%" == "" ( pause ) ) exit /b 0 :MainFin if not "%errorlevel%" == "0" ( echo Error %errorlevel%. %error_message% ^(g_ErrorID=%g_ErrorID%^) if "%no_error_pause%" == "" ( pause ) exit /b %errorlevel% ) goto :eof rem ******************************************************************** rem * Function: gs_CutPatchVersionNumber rem * rem * Arguments: rem * "%~1" - A version number. e.g. 1.2.3 rem * rem * Return Value: rem * %retun_value% - Major and minor version number. e.g. 1.2 rem ******************************************************************** :gs_CutPatchVersionNumber set return_value=%~n1 goto :eof rem ******************************************************************** rem * Section: batlib rem ******************************************************************** rem ******************************************************************** rem * Function: Error rem * rem * Arguments: rem * "%~1" - Value of setting %errorlevel% rem * "%~2" - Error message rem * rem * Return Value: rem * %errorlevel% - %~1. Number type rem * rem * Example: rem * if "%parameter%" == "" ( call :Error 1 & exit /b ) rem * rem * Example: rem * if "%parameter%" == "" ( call :Error 1 "No parameter '%variable%'" & exit /b ) rem * rem * Description: rem * This sets %error_message% variable. rem * This adds %g_ErrorID% variable. rem * This echos each command from %g_ErrorID% was matched %g_EchoErrorID%. rem ******************************************************************** :Error set /A g_ErrorID = %g_ErrorID% + 1 set error_message=%~2 rem // "echo %error_message%" cannot execute, if there are "<" and ">" of "". if "%g_ErrorID%" == "%g_EchoErrorID%" ( echo. echo =============================================================================== echo ^ call :DebugBreak echo. echo. echo on ) exit /b %~1 goto :eof rem ******************************************************************** rem * Function: SetVariables rem * SetVariables rem * rem * Arguments: rem * "%~1" - main "%~0" rem * rem * Return Value: rem * None rem ******************************************************************** :SetVariables rem // g_ErrorID = ... set g_ErrorID=0 rem ******************************************************************** rem * Variable: g_ThisBatchPath rem ******************************************************************** set g_ThisBatchPath=%~1 rem // ReplaceParentheses set g_ThisBatchPath=%g_ThisBatchPath:(=__% set g_ThisBatchPath=%g_ThisBatchPath:)=__% rem // Set current folder to the parent folder of this file. if not "%g_ThisBatchPath:~0,2%" == "\\" ( cd "%~d1%~p1" ) else ( if not exist "%USERPROFILE%\BatchWork" ( mkdir "%USERPROFILE%\BatchWork" ) cd "%USERPROFILE%\BatchWork" echo cd "%USERPROFILE%\BatchWork" ) rem ******************************************************************** rem * Variable: True rem ******************************************************************** set True=0 rem // 0 is same as the specifiation of Linux bash "test" command and batch file "comp" command. rem // It is not same as the specifiation of C language boolean type. rem ******************************************************************** rem * Variable: False rem ******************************************************************** set False=1 rem // Not 0 is same as the specifiation of Linux bash "test" command and batch file "comp" command rem // It is not same as the specifiation of C language boolean type. exit /b 0 goto :eof ■■ 注目ニュース 一覧 ■■ ◇ マイクロソフト、Visual Studio Code の Python 拡張機能をアップデート。 https://japan.zdnet.com/article/35136381/ … Python の人気が JavaScript を抜いて1位に。 ◇ グラフでうそをつく方法とは? https://gigazine.net/news/20190430-how-to-lie-with-charts/ … 作る人も見る人も知っておくべき。 ◇ 難解な論文をわかりやすく要約してくれるAI が開発される。 https://gigazine.net/news/20190427-science-writing-be-automated/ … 斜め読みを支援。まだ研究中。 ◇ Appleが一部のペアレンタルコントロールアプリを削除した理由を説明。 https://gigazine.net/news/20190429-parental-control-apps-apple/ https://www.apple.com/jp/newsroom/2019/04/the-facts-about-parental-control-apps/ … プライバシーの問題が大人に渡ると機能削除する。 ◇ 日本の専門学校など6校が AWS 専門コースを4月に開講。 https://japan.cnet.com/article/35136412/ … Amazon のプラットフォームを使った開発が多いため。 ◇ グーグル、ハラスメントや差別を従業員が報告できる専用サイト開設。 https://japan.cnet.com/article/35136366/ … 社会問題に対するソリューションができるかもしれない。 ◇ AI開発でユーザーの会話を盗み聞きするアマゾンとAlexa養育係の話。 https://japan.cnet.com/article/35136312/ … プライバシーは必要だが、プライベートこそ聞いてて不快な言葉も聞こえる。 ◇ 英国はなぜ米国の警告を無視してファーウェイの5G機器を受け入れるのか。 https://japan.cnet.com/article/35136406/ … 機密を要するネットワークには使わず、使うなら政府の評価センターなどで政治的優位を保つ。 ◇ ソニー、2018年度は過去最高益--ゲームが大幅増収増益。 https://japan.cnet.com/article/35136423/ … ネットワーク サービスが増益。 ◇ 携帯3キャリアの +メッセージ で企業が個人とやり取り可能に。銀行の変更手続きも https://japan.cnet.com/article/35136227/ … 携帯大手3社だけでは普及しない。MVNO では制限付きにするのも1つの手。 ◇ グーグル親会社Alphabetのシュミット氏、取締役を退任へ。 https://japan.cnet.com/article/35136485/ … 広告収入が伸びていないからか。 ■■ ソフトウェアデザイン館 Sage Plaisir 21 ■■ ホームページ >>> http://www.sage-p.com/ メルマガ >>> http://www.mag2.com/m/0000083983.html ブログ >>> http://blog.livedoor.jp/sage_p/ ツイッター >>> http://twitter.com/Ts_Neko ダウンロード >>> http://www.sage-p.com/freesoft.htm サポート掲示板 >>> http://www.sage-p.com/kg_ban09/z6037C8.cgi 東日本大震災 >>> http://www.sage-p.com/saigai.html メール >>> ts-neko◇sage-p.com ←◇を@に変えてください 緊急メールは件名に「うどんメール」を付けてください。 このメルマガの登録・解除 - http://www.mag2.com/m/0000083983.htm