※このホームページは、バリアフリーを目指し、音声読み上げソフトに対応しています。

 


新・電子ノートブック Snap Note 3
  フリーソフト Snap Note 3 mini 公開!  

ソフトウェア・デザイン館 Sage Plaisir 21 へようこそ!
隔週月曜更新 : 毎週1つのニュースまたはプログラミング技術を取り上げ、解説します。

東日本大震災 まとめページ

[PR] 最強のスクリプト・ライブラリ vbslib5 が Windows 10 に対応!
[PR] シェル・スクリプトを格段に使いやすくする bashlib1 公開中


週刊 IT プログラミング技術 2019/ 5/ 6

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 "<ERROR/>".   if "%g_ErrorID%" == "%g_EchoErrorID%" (     echo.     echo ===============================================================================     echo ^<ERROR errorlevel="%~1" error_message="%~2" g_ErrorID="%g_ErrorID%"/^>     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

Sage Plaisir 21 のブログやツイッターを読もう!

Sage Plaisir 21 では、ここのホームページのほかにブログとツイッター も行っています。
ブログは、こちら。
ツイッターは、こちら。

Sage Plaisir 21 メールマガジンを読もう!

週刊 IT ニュース&コラム』には、 このページに掲載している コラムの他に、注目ニュースを集めたリンク集も、掲載しています。 日々多く集まる IT 情報から、注目すべき話題をコラム形式で取り上げますので、 ぜひチェックしておきましょう。 (サンプル、および登録)


Sage Plaisir 21 Contents
[ English | 日本語 ]

自動化ツールのダウンロード (2017-01-04) update!

急速な IT 革命により開発スピードの向上が課題になっています。 その鍵になるのがツールの活用または開発です。 一般的なものから専門的なものまで使えるツールを公開しています。

技術資料&オープンソース (2012-03-19)

扱う技術が多くなってくるにつれ、 技術はマスターするものではなく調べるものになり、 どれだけ実践に即した資料を集められるかどうかが、 勝負になります。標準的な技術の資料だけでなく、 プログラムソースやライセンスフリーのライブラリも公開しています。

オブジェクト指向プログラミング設計 (2000-04-01)

Visual Basic 7 にもついに本格的なオブジェクト指向の 機能が追加され、ソフトウェア技術者には必須の知識に なりつつあります。長年の研究の成果から、最新の応用方法まで 様々なメモを公開しています。

ソフトウェア・デザイン館より(技術エッセイ)   (2000-11-01)

プロの経験を通じて習得したソフトウェア全般に関する 技術を解説しています。 ソフトウェアとは何かといった根本的なことを通じて、 デザインに関するポイントをわかりやすく説明しています。


          
 ソフトウェア
デザイン館
Sage Plaisir 21

Simple and Visual

SagePlaisir21サーチ
パワード・バイ・グーグル

週刊 IT ニュース&コラム

5/6 Windows で Python スクリプトを Python の仮想環境の中で起動する方法

4/22 Windows で USB デバイスの安全な取り外しの操作が不要に

4/7 ブール型の説明変数の名前は文にする - リーダブル コード(60)

3/25 グーグルがゲーム ストリーミング サービスに参入、STADIA を発表

3/11 ソースコードが早く読めるようになる、シンプルコメント2 - リーダブル コード(59)

2/25 無料で使えるように改変した iOS アプリを何者かが配布

2/11 ソースコードが早く読めるようになる、シンプルコメント2 - リーダブル コード(58)

1/28 5月1日から変更される新元号の名前の発表が 4月1日に決定

12/31 空行の後は説明変数を積極的に使うこと - リーダブル コード(57)

12/17 グーグル Chrome のコアが、Microdoft Edge ブラウザーのコアに採用へ

12/3 空行はブロックの前ではなく読ませたい文の前に入れる - リーダブル コード(56)

11/19 Windows Update するとファイル名の大文字小文字を区別しないことが可能に

11/5 変数を設定するためのループに付けるコメント - リーダブル コード(55)

10/22 Windows を最新版に更新するとファイルが削除される不具合

10/8 名前付き引数が使えないときの説明引数 - リーダブル コード(54)

9/24 Amazon スマートスピーカーの対応機器を増やす Alexa Gadgets Toolkit

9/10 関数の引数は入力と出力だけじゃない - リーダブル コード(53)

8/27 第三者が作成した電子書籍から作者へ利益還元するシステム

8/13 ワイルドカードを拡張する サブ フォルダー記号と FF-path 属性

7/30 CPU のリターン予測機能に見つかった脆弱性 スペクターRSB

7/16 メンバー変数は、グローバルのスタイルにする - リーダブル コード(52)

7/2 車のキーがスマホに置き換わる Digital Key

6/18 関数の引数は、グローバルとローカルの両方のスタイルにする - リーダブル コード(51)

6/4 EUの個人データ保護法GDPRの施行が開始され早速訴えられる

5/21 グローバルかローカルかを瞬時に分かるようにする - リーダブル コード(50)

5/ 7 漫画の海賊版サイトをブロッキングできるよう政府が体制整備

4/23 if節と主節を逆にするな - リーダブル コード(49)

4/ 9 Facebook で入手した個人情報がトランプ氏を当選させたとして炎上

3/26 カバレッジ100%を目標にしないほうが品質が高い

3/12 グーグルがよしとする Web ページかどうかを自動診断する Lighthouse

2/26 正常条件を示す、括弧の内側の空白を消すな - リーダブル コード(48)

2/12 コインチェックから NEM が流出、仮想通貨全体の信用低下

1/29 テスト プログラムに必須のコメント

1/15 CPU の投機実行とキャッシュに見つかった脆弱性 スペクターとメルトダウン

12/18 メモリーやコンピューターなど、語尾の長音記号を省略するな

12/4 ツイッターが認証済みアカウントの定義を変更

11/20 関数の直後に空白を入れるな - リーダブル コード(47)

11/4 無線LANの暗号 WPA2 に脆弱性 KRACKs、ただし危険度は小

10/23 XML にローカル変数が使えるようになる vbslib の LoadLocalVariableInXML

10/9 スマート スピーカー Google Home が日本で発売

9/25 XML に変数が使えるようになる vbslib の LazyDictionaryClass

9/11 京セラが汎用的な IoTユニットを開発。屋外での監視作業を自動化へ

8/28 変数の展開を遅延評価する vbslib の LazyDictionaryClass

8/14 HTML5 版ゲームのサービス開始や会社の設立が相次ぐ

7/31 人が死んだバグ、セラック25の事故から学ぶべき Nancy 教授の教訓

7/17 チケットの転売対策にも普及したSMS認証とその闇

7/3 Keyword Substitution の違いを無視して比較する DiffWithoutKS

6/19 安心して手軽にボランティア活動ができる &HAND

6/5 使っていないソースのセクションをカットする DoTextShrink

5/22 ツイッターの機能にフォーラムの機能を追加したマストドン

5/8 ソース ファイルの一部を隠す CutSharpIf, CutComment

4/24 iOS アプリ版ツイッターだけが17歳未満で使用禁止になる

4/10 マージがコンフリクトしても自動解決する ThreeWayMerge

3/27 あなたの机や壁がタッチパネルになる Xperia Touch

3/13 ソース ファイルの英訳と WHITE SQUARE エンコーディング判定法

2/27 運送業大手 UPS がトラックからドローンを発着する実験に成功

2/13 使いなれた外部プログラムを vbslib から起動する Setting コマンド

1/30 Nintendo Switch の新しいコントローラー Joy-Con

1/16 プログラム ソースの静的設定を一度に行う vbslib の Switches

12/19 銀行の API 仕様の公開へ、金融制度ワーキング グループ

12/5 よく使うコードの断片として登録するべきデバッグ用スニペット

11/21 ファンクション キーを Touch Bar に置き換えた MacBook Pro

11/7 人工知能の進化にみる論理的思考の限界と新しい開発プロセスの必要性

10/24 アマゾンが講談社の電子書籍を無断で配信を停止

10/10 レアケースの処理が最初に来る条件式を書くな - リーダブルコード(46)

9/26 東京ゲームショウ2016、PS4, PSVR 対応ゲームが本格化

9/12 数字があれば詳細に分析できているとは限らない

8/29 乾電池が IoT になる MaBeee が一般販売を開始

8/15 バカにはできない定性的な見積もりの代表 KKD 法

8/ 1 スマホ向けゲーム、ポケモンGOのダウンロードが開始され社会現象に

7/18 メインの処理の前の空行を詰めるな - リーダブルコード(45)

7/ 4 Webサービスを連携する IFTTT のイントラネット版、Microsoft Flow

6/20 名前空間のエイリアスは省略するな - リーダブルコード(44)

6/ 6 それぞれの工程に専門家を配置する工程別分業開発

5/23 それぞれの工程に専門家を配置する工程別分業開発

5/ 8 人間の手をスマート ウォッチのタッチパッドにする SkinTrack

4/25 テスト駆動開発では、失敗するようなテストを書くな

4/11 Windows で bash が動く Windows Subsystem for Linux 発表

3/28 手戻りの少ない仕様には、必ずテスト コードが存在する

3/14 連邦裁判所が命じた捜査協力を拒否するIT業界が隠していること

2/29 哲学の成果に基づいて、仕様書と同時にサンプルやテストを作ろう

2/15 Visual Studio Code がスマホ向けライブラリー Cordva に対応

2/ 1 ウォーターフォールは最後だけで、まずプロトタイピングをしよう

1/18 たった 5ドルのコンピューター Raspberry Pi Zero が発売

12/28 ルールをルールにするな - リーダブル・コード(43) 特別編

12/14 IBM、人工知能で適切な Web API を提案する API Harmony を発表

11/30 ヨーダ記法で書くな (4) - リーダブル・コード(42)

11/16 Android のアドウェアが2万を超えるアプリで検出される

11/ 2 ヨーダ記法で書くな (3) - リーダブル・コード(41)

10/19 フォルクスワーゲンが排出ガス処理の無効化プログラムを認める

10/ 5 ヨーダ記法で書くな (2) - リーダブル・コード(40)

9/21 3D Touch の iPhone 6s、大画面の iPad Pro を発表

9/ 7 ヨーダ記法で書くな (1) - リーダブル・コード(39)

8/24 Windows10 のオンライン無料アップグレード開始。無料期間は1年

8/10 ポインター宣言を表す * を変数に付けるな - リーダブル・コード(38)

7/26 Nintendo DS, Wii を開発した 任天堂の岩田聡社長がご逝去

7/13 カッコの内側の空白の有無を統一するな - リーダブル・コード(37)

6/29 日本年金機構から個人情報流出。対策法の改善を考察する

6/15 連続した空白を1つにまとめるな - リーダブル・コード(36)

6/ 1 iOS や Android 向けのソースもビルドできる Windows 10

5/18 インクリメントの演算子を書くな - リーダブル・コード(35)

5/ 4 Apple Watch 発売。スマホが普及した現代に必要かどうか

4/20 大文字小文字に統一するな - リーダブル・コード(34)

4/ 6 Google の次世代 JavaScript、Dart は Chrome に組み込まない方針へ

3/23 配列を pointer と名付けるな - リーダブル・コード(33)

3/ 9 Lenovo 製 PC に付属の Superfish に Web サイトを偽装する脆弱性

2/23 ハンガリアン記法を使うな - リーダブル・コード(32)

2/ 9 現実世界にホログラムを表示することが現実的になる HoloLens

1/26 this ポインターを省略するな - リーダブル・コード(31)

1/12 新型 MacBook Air は、USB Type-C 端子のみ搭載されると予想

12/22 キャピタライゼーションを無視したルールを作るな - リーダブル・コード(30)

12/ 8 Visual Studio Professional と同じ機能の無料版 VS Comminuty

11/24 性能を暗黙的に示すルールを作るな - リーダブル・コード(29)

11/10 W3C より HTML 5 がついに勧告される

10/27 実装依存回避のために独自の定義をするな - リーダブル・コード(28)

10/13 多くの Linux で使われる bash に重大な脆弱性が多数発生

9/29 #define のシンボルを大文字だけにするな - リーダブル・コード(27)

9/15 富士通が発表した設計書からプログラムを自動生成するツールの使い道

9/1 連続した空行、空白、アンダースコアを禁止にするな - リーダブル・コード(26)

8/18 YouTube のような無料の PDF 文書投稿サイト PDFy

8/4 処理内容を示していない関数名を禁止にするな - リーダブル・コード(25)

7/21 Facebook がニュースフィードの一部を減らして無断で心理実験

7/7 プリプロセッサーを行頭に書くな - リーダブル・コード(24)

6/23 Google が YouTube からインディーズレーベルを締め出し

6/9 計算順序を明示する冗長な括弧は書くな - リーダブル・コード(23)

5/26 Google と OpenSSL にパスワードなどが盗み取られる脆弱性

5/12 アドレスに &演算子を強制するな(2) - リーダブル・コード(22)

4/28 STAP 細胞の疑惑を最初に指摘した匿名検証サイト PubPeer

4/14 アドレスに &演算子を強制するな(1) - リーダブル・コード(21)

3/31 マイクロソフトの Office 365 が iPad に対応、閲覧は無料

3/17 アドレスやポインターを配列にするな - リーダブル・コード(20)

3/3 仮想通貨 ビットコイン の大手取引所 Mt.Gox が民事再生法を申請

2/17 カード節と分岐を一緒にするな - リーダブル・コード(19)

2/3 Google Chrome から CSS Regions 標準のサポートを廃止する検討

1/20 複雑な条件式は AND と OR だけにするな - リーダブル・コード(18)

もっと前の記事

自動化ツールのダウンロード

Snap Note 3 mini - サクサク使える自由ノート  new!

Plastic Window 1.20 - ウィンドウを半透明に  new!

Shortcut Director 1.00 - ショートカットのリンク切れ修正

Archives Folderizer SV 1.10 - 圧縮解凍

デジタルスクラップブックSVG Cats 2

その他のツール

オブジェクト指向プログラミング設計

技術資料

All Text composed by T's-Neko ts-neko@sage-p.com,