VBScript で呼び出したプログラムの実行結果(標準出力)を取得する方法

課題

VBScript でプログラムを実行した時に、実行結果としてコマンドプロンプトに表示される文字列を取得したいと考えたことはありませんか ? 

 

WScript.Shell の Run で実行した場合、コマンドの実行結果(標準出力)を取得することはできません。

 

解決方法

WScript.Shell オブジェクトの Exec メソッドを使うと、標準出力を取得することができます。

 

例えば、Exec メソッドを使って、ipconfig を実行し、その実行結果を表示する場合のスクリプトは、以下のようになります。

 

'オブジェクトを生成
Set objWshShell = CreateObject("WScript.Shell")

'コマンドを実行
Set objExec = objWshShell.Exec("ipconfig")

'コマンド実行結果を出力
Do While objExec.StdOut.AtEndOfStream = false
    line = objExec.StdOut.ReadLine
    WScript.Echo line
Loop

 

 

Python でプログラムを実行する方法

Python でプログラムを実行する場合には subprocess を使います。

 

基本的な使い方は以下の通りです。

 import subprocess

proc = subprocess.Popen([r"c:\Windows\system32\notepad.exe","test.txt"])
proc.wait(timeout=60)

 

上記では、notepad.exe で test.txt を起動しています。コマンドとその引数を指定する場合には配列を使って指定します。

 

subprocess は起動したプログラムの終了を待たないので、wiat を使って処理完了をするのを待ちます。この時、タイムアウトを指定することができます。上記の例では、60秒です。タイムアウトすると、プログラムが終了するのではなく、TimeoutExpired という例外が発生します。

 

処理を待つには、poll を使うこともできます。

 import subprocess

proc = subprocess.Popen(r"c:\Windows\system32\notepad.exe")
while True:
return_code = proc.poll()
if return_code is None:
time.sleep(3)
else:
break

 

上記の例では、3秒おきに状態確認をしています。None でなくなったら、break し、後続の処理が行われます。

 

 

 

Python で CSVファイルを読み込む方法

Python の標準モジュールである csv モジュールを使った CSV データの読み込みを検証しました。

始めに通常の読み込みを行い、その後、読み込んだデータをディクショナリに格納します。

 

 

検討1: CSV ファイルを読み込む

 

1. 読み込み対象の CSVファイル

買い物リスト.csv

りんご,オレンジ,ぶどう
シャーペン,マジック

 

2. プログラム

import csv

# ファイルをオープンする
with open("買い物リスト.csv", encoding="utf8") as f:
# CSV を読み込む
csv_reader = csv.reader(f)

# 参考までに type を表示
print(type(csv_reader))

# 読み込んだ内容を表示する
for row in csv_reader:
print(row)

 

 

出力結果

<class '_csv.reader'>
['りんご', 'オレンジ', 'ぶどう']
['シャーペン', 'マジック']

 

説明

csvモジュールを使って CSVファイルを読み込むためには、まず始めにファイルそのものを読み込む必要があります。

 

ファイルの読み込みには open を使います。そして、open をしている with 構文内で csv モジュールを使ってファイルの内容を CSV として読み込みます。

 

csv.reader() で読み込まれた内容は csv_class となります。内容を取り出すには、for 文を使います。

 

---

検討2: CSV の読み込みを関数にする

 

CSV を読み込むための関数を作成し、外部の処理へ読み込み結果を渡すようにしてみました。

 

・読み込み対象の CSVファイル: 買い物リスト

りんご,オレンジ,ぶどう
シャーペン,マジック

 

・プログラム

import csv


# CSVファイルを読み込む
def read_csv(file):
with open(file, encoding="utf8") as f:
# CSV を読み込む
csv_reader = csv.reader(f)
content = []

for row in csv_reader:
content.append(row)

return content


if __name__ == "__main__":
# csv_readerクラスを受け取る
csv_data = read_csv("買い物リスト.csv")

# csv_readerクラスを確認
print(type(csv_data))

# csv_reader内容を表示
for row in csv_data:
print(row)

 

出力結果

<class 'list'>
['りんご', 'オレンジ', 'ぶどう']
['シャーペン', 'マジック']

 

 

---

検討3: CSV の読み込みを関数にする (失敗例)

 

実行例2 の前に思いついたのが、この方法です。CSV を読み込む関数から csv_reader クラスを返して、本体の処理で中身を取り出そうとしました。csv_readerクラスを渡すことはできるのですが、中身を表示しようとすると、既に閉じたファイルへのアクセスだということでエラーになります。

 

import csv


# CSVファイルを読み込む
def read_csv(file):
with open(file, encoding="utf8") as f:
# CSV を読み込む
csv_reader = csv.reader(f)

return csv_reader


if __name__ == "__main__":
# csv_readerクラスを受け取る
csv_file = read_csv("買い物リスト.csv")

# csv_readerクラスを確認
print(type(csv_file))

# csv_reader内容を表示
for row in csv_file:
print(row)

 

表示されるエラーメッセージ

Traceback (most recent call last):
File "csv_sample.py", line 21, in <module>
for row in csv_file:
ValueError: I/O operation on closed file.
<class '_csv.reader'>

 

---

検討4: 読み取った CSV の内容をディクショナリにする

 

買い物リスト内容を修正し、1列目にその行に列挙されている品物の種類を表す分類列 を付与することにしました。それが後述の "買い物リスト2" です。

 

この分類列(今回の例では "くだもの"と"文房具")をキーにしたディクショナリを作成すれば、CSV を読み込んだ後、分類をキーにして特定行を呼び出すことができるようになります。

 

CSV データを出てきた順に処理するのであればリストで問題ないのですが、後から特定行だけを呼び出す場合、ディクショナリが便利だと思いました。

 

・読み込み対象の CSVファイル: 買い物リスト2

くだもの,りんご,オレンジ,ぶどう
文房具,シャーペン,マジック

 

・プログラム

import csv

# CSVファイルを読み込む
def read_csv(file):
with open(file, encoding="utf8") as f:
# CSV を読み込む
csv_reader = csv.reader(f)
content = {}

for row in csv_reader:
content[row[0]] = row[1:]

return content


# csv_readerクラスを受け取る
csv_data = read_csv("買い物リスト2.csv")

# csv_readerクラスを確認
print(type(csv_data))

# 内容の表示
# CSVデータ全て
print(csv_data)

# くだもの行の呼び出し
print(csv_data["くだもの"])

# くだもの行の特定列の呼び出し
print(csv_data["くだもの"][1])

 

・出力結果

<class 'dict'>
{'くだもの': ['りんご', 'オレンジ', 'ぶどう'], '文房具': ['シャーペン', 'マジック']}
['りんご', 'オレンジ', 'ぶどう']
オレンジ

 

認証プロキシ環境下で pip を使ってパッケージをインストールする方法

概要

企業など、認証プロキシを使用している環境では、デフォルトでは、pip によるパッケージのインストールができません。ここでは、Windows を使用していることを前提に、認証プロキシを通すための設定を説明します。

 

手順

pip には、--porxy オプションがあるのですが、自分の環境ではそちらの方法ではうまくできなかったため、環境変数を使用して設定しました。

 

まず、プロキシの設定を環境変数に設定します。

 

1. PowerShell を起動します。

2. 以下の通り、環境変数を設定します。

```

$env:HTTP_PROXY=http://username:password@proxy:port
$env:HTTPS_PROXY=https://username:password@proxy:port

```

 

これで完了です。

あとは、通常通り、pip を使えばパッケージがインストールできます。

例えば、PySimpleGUI をインストールするならば、以下のような感じです。

```

python -m pip install  PySimpleGUI

```

 

 

 

 

 

 

 

 

 

 

Python: リストに関する処理

リストの要素の型変換

 

# 元になるリスト
list1 = ["1", "2", "3"]
print("list1", end="")
print(list1)

# リスト内包表記 (List comprehensions) を使う場合
list2 = [int(x) for x in list1]
print("list2", end="")
print(list2)

 

・実行結果

list1['1', '2', '3']
list2[1, 2, 3]