第9章 標準ライブラリ

標準ライブラリとは

Pythonの標準ライブラリとはPythonと共にデフォルトで提供される、予め組み込まれたモジュールの集まりを指します。これらのモジュールは、プログラムの開発を簡単にし、様々なタスクに対応するための便利なツールや関数を提供します。


モジュールとは

Pythonにおけるモジュールとは、Pythonのコードが記述されたファイルのことを指します。モジュールは、変数、関数、クラスなどを定義し、それらを一つの単位としてまとめることができます。また、一つのモジュールが提供する機能を他のモジュールから利用することが可能です。これにより、コードの再利用性や管理性を高めることができます。

モジュールはimport文を使用して他のPythonコードから読み込むことができます。

また、モジュールには標準ライブラリとして提供されるものの他に、サードパーティによって提供されるものや自分で作成することも可能です。自分で作成したPythonファイルもモジュールとして扱うことができ、同じディレクトリ内の他のPythonファイルからimportして使用することができます。


数値と数学に関するモジュール

math, random, statistics など


データ型に関連するモジュール

datetime, collections, array など


ファイルとディレクトリアクセス

os, shutil, glob, pathlib など


データの永続化とアーカイブ化

pickle, json, csv, sqlite3 など


並行実行

threading, multiprocessing, concurrent.futures など


ネットワークとインターネット

socket, email, http.client, urllib.request など


デバッグとプロファイリング

pdb, timeit, trace など


ソフトウェアパッケージングと配布

distutils, venv など


Pythonランタイムサービス

sys, gc, inspect など


それぞれのモジュールサンプル

mathモジュール

mathモジュールは、数学的な計算を行うためのさまざまな関数を提供しています。これには、三角関数、対数関数、指数関数、複素数を含む平方根などの計算が含まれます。

import math

# 平方根を計算
sqrt_val = math.sqrt(16)
print(f"16の平方根: {sqrt_val}")

# 四捨五入
rounded_val = round(5.7)
print(f"5.7の四捨五入: {rounded_val}")

# 自然対数
log_val = math.log(10)
print(f"10の自然対数: {log_val}")

# 底が10の対数
log10_val = math.log10(100)
print(f"100の底が10の対数: {log10_val}")

# 三角関数 (sin, cos, tan)
sin_val = math.sin(math.pi/2)  # pi/2の正弦
print(f"pi/2の正弦: {sin_val}")

cos_val = math.cos(math.pi)  # piの余弦
print(f"piの余弦: {cos_val}")

tan_val = math.tan(0)  # 0の正接
print(f"0の正接: {tan_val}")


randomモジュール

randomモジュールは、乱数を生成するための機能を提供しています。このモジュールには、一様分布、ガウシアン分布など様々な分布に基づく乱数生成関数、ランダム選択、並べ替え、種の設定など、乱数に関する多くの操作が含まれています。

import random

# 0.0以上、1.0未満の範囲でランダムな浮動小数点数を生成
random_float = random.random()
print(f"生成されたランダムな浮動小数点数: {random_float}")

# 1から10までの範囲でランダムな整数を生成
random_int = random.randint(1, 10)
print(f"生成された1から10までのランダムな整数: {random_int}")

my_list = [1, 2, 3, 4, 5]

# シーケンスからランダムに1つの要素を選択
random_choice = random.choice(my_list)
print(f"リストからランダムに選択された要素: {random_choice}")

# シーケンスの順序をランダムに並べ替え
random.shuffle(my_list)
print(f"ランダムに並べ替えられたリスト: {my_list}")


statisticsモジュール

statisticsモジュールは、数値データの基本的な統計的性質を計算するための関数を提供しています。これには、平均、中央値、モード(最頻値)、標準偏差、分散などの計算が含まれます。

import statistics

# データのリスト
data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]

# 平均を計算
mean_val = statistics.mean(data)
print(f"データの平均: {mean_val}")

# 中央値を計算
median_val = statistics.median(data)
print(f"データの中央値: {median_val}")

# モードを計算
mode_val = statistics.mode(data)
print(f"データの最頻値: {mode_val}")

# 標準偏差を計算
stdev_val = statistics.stdev(data)
print(f"データの標準偏差: {stdev_val}")

# 分散を計算
variance_val = statistics.variance(data)
print(f"データの分散: {variance_val}")


datetimeモジュール

datetimeモジュールは、日付や時間を操作するためのクラスを提供しています。日付や時間の操作、書式の変換、時間帯の操作などが可能です。

import datetime

# 現在の日時を取得
now = datetime.datetime.now()
print(f"現在の日時: {now}")

# 日付のみを取得
today = datetime.date.today()
print(f"今日の日付: {today}")

# 時間のみを取得
current_time = now.time()
print(f"現在の時間: {current_time}")

# 日時の加算
one_week_after = now + datetime.timedelta(weeks=1)
print(f"1週間後の日時: {one_week_after}")

# 日時の書式変換
formatted_date = now.strftime("%Y年%m月%d日 %H時%M分%S秒")
print(f"書式変換後の日時: {formatted_date}")


collectionsモジュール

collectionsモジュールは、特殊な形式のコンテナデータ型を提供しています。これらは、リスト、タプル、辞書などの組み込みコンテナをより特化した形で使用する場合に利用します。

from collections import defaultdict, namedtuple, Counter

# defaultdict: デフォルト値を持つ辞書型
d = defaultdict(int)
d['apple'] += 1
print(d)  # 出力: defaultdict(, {'apple': 1})

# namedtuple: 名前付きタプル
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y)  # 出力: 10 20

# Counter: 要素の出現回数を数える
c = Counter('hello world')
print(c)  # 出力: Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})


arrayモジュール

arrayモジュールは、配列(array)という、特定の型の要素を一列に並べたデータ構造を提供します。一般的なリストとは異なり、配列は全ての要素が同じ型であるため、大量の数値データを格納・処理するのに効率的です。

import array

# 'i'は符号付き整数型を意味します
arr = array.array('i', [1, 2, 3, 4, 5])

# 配列に要素を追加
arr.append(6)
print(arr)  # 出力: array('i', [1, 2, 3, 4, 5, 6])

# 配列から要素を削除
arr.remove(3)
print(arr)  # 出力: array('i', [1, 2, 4, 5, 6])

# 配列の要素にアクセス
print(arr[0])  # 出力: 1


osモジュール

osモジュールは、オペレーティングシステム(OS)とやり取りするための機能を提供します。具体的には、ファイルやディレクトリの操作(作成、削除、名前の変更など)、環境変数の取得、プロセス管理など、OSレベルの操作が可能になります。

import os

# 現在の作業ディレクトリを取得
cwd = os.getcwd()
print(cwd)  # 例: '/home/user'

# 新しいディレクトリを作成
os.mkdir('new_directory')

# ディレクトリの存在を確認
print(os.path.exists('new_directory'))  # 出力: True

# ディレクトリ名を変更
os.rename('new_directory', 'old_directory')

# 環境変数を取得
path = os.environ['PATH']
print(path)  # 例: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'


osモジュール

osモジュールは、オペレーティングシステム(OS)とやり取りするための機能を提供します。具体的には、ファイルやディレクトリの操作(作成、削除、名前の変更など)、環境変数の取得、プロセス管理など、OSレベルの操作が可能になります。

import os

# 現在の作業ディレクトリを取得
cwd = os.getcwd()
print(cwd)  # 例: '/home/user'

# 新しいディレクトリを作成
os.mkdir('new_directory')

# ディレクトリの存在を確認
print(os.path.exists('new_directory'))  # 出力: True

# ディレクトリ名を変更
os.rename('new_directory', 'old_directory')

# 環境変数を取得
path = os.environ['PATH']
print(path)  # 例: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'


shutilモジュール

shutilモジュールは、高レベルのファイルやディレクトリの操作を提供します。これにはファイルのコピー、ディレクトリの移動、削除などが含まれます。osモジュールと同様に、shutilモジュールもOSとのインタラクションを可能にしますが、より高レベルの操作が可能で、複数のファイルやディレクトリを一度に操作することができます。

import shutil
import os

# ファイルのコピー
shutil.copy('source.txt', 'destination.txt')

# ディレクトリのコピー
shutil.copytree('source_directory', 'destination_directory')

# ファイルの移動
shutil.move('source.txt', 'destination.txt')

# ディレクトリの削除
shutil.rmtree('directory_to_delete')

# ディレクトリが存在するかどうかのチェック
print(os.path.exists('directory_to_delete'))  # 出力: False


globモジュール

globモジュールは、Unixシェルのグロブパターン(ワイルドカード)を使ったファイルパスの検索を提供します。これを使用することで、特定のパターンに一致するファイルやディレクトリのパスを簡単に見つけることができます。

import glob

# 現在のディレクトリの全ての.txtファイルを検索
txt_files = glob.glob('*.txt')
print(txt_files)  # 出力: ['file1.txt', 'file2.txt', 'file3.txt']

# サブディレクトリを含む全ての.txtファイルを検索
all_txt_files = glob.glob('**/*.txt', recursive=True)
print(all_txt_files)  # 出力: ['file1.txt', 'dir1/file2.txt', 'dir2/file3.txt']

# 特定のパターンに一致する全てのファイルを検索
pattern_files = glob.glob('file?.txt')
print(pattern_files)  # 出力: ['file1.txt', 'file2.txt', 'file3.txt']


pathlibモジュール

pathlibモジュールは、ファイルシステムパスに対するさまざまな操作をオブジェクト指向スタイルで行う機能を提供します。具体的には、パスの生成、ファイルやディレクトリの存在確認、ファイルの読み書き、ディレクトリの作成・削除などの操作を提供しています。

from pathlib import Path

# Pathオブジェクトの作成
p = Path('.')

# 現在のディレクトリの全ての.txtファイルを検索
txt_files = list(p.glob('*.txt'))
print(txt_files)  # 出力: [PosixPath('file1.txt'), PosixPath('file2.txt')]

# ファイルの存在確認
print(p.exists())  # 出力: True

# ファイルの読み書き
new_file = Path('new_file.txt')
new_file.write_text('Hello, pathlib!')  # ファイルにテキストを書き込む
print(new_file.read_text())  # ファイルからテキストを読み込む。出力: 'Hello, pathlib!'

# ディレクトリの作成と削除
new_dir = Path('new_dir')
new_dir.mkdir(exist_ok=True)  # ディレクトリを作成。既に存在する場合は何もしない
print(new_dir.exists())  # 出力: True
new_dir.rmdir()  # ディレクトリを削除
print(new_dir.exists())  # 出力: False


pickleモジュール

pickleモジュールは、オブジェクトの直列化(シリアライズ)と逆直列化(デシリアライズ)を提供します。これにより、Pythonオブジェクトをバイトストリームとして保存し、そのバイトストリームを再びPythonオブジェクトに戻すことができます。この機能は、大きなデータ構造を簡単に保存して再利用したり、オブジェクトをネットワーク経由で送信したりするときに有用です。

import pickle

# シリアライズしたいオブジェクトを作成
data = {
    'name': 'John',
    'age': 30,
    'pets': ['cat', 'dog']
}

# オブジェクトをpickleでシリアライズ(保存)
with open('data.pkl', 'wb') as f:
    pickle.dump(data, f)

# pickleを使ってデータをデシリアライズ(読み込み)
with open('data.pkl', 'rb') as f:
    loaded_data = pickle.load(f)

print(loaded_data)  # 出力: {'name': 'John', 'age': 30, 'pets': ['cat', 'dog']}


jsonモジュール

jsonモジュールは、JSON(JavaScript Object Notation)形式のデータのエンコード(シリアライズ)とデコード(デシリアライズ)を提供します。これにより、PythonオブジェクトをJSON形式の文字列に変換し、そのJSON形式の文字列を再びPythonオブジェクトに戻すことができます。この機能は、データを他のプログラミング言語と共有したり、構造化データをファイルやネットワーク経由で送信したりするときに有用です。

import json

# シリアライズしたいオブジェクトを作成
data = {
    'name': 'John',
    'age': 30,
    'pets': ['cat', 'dog']
}

# オブジェクトをjsonでシリアライズ(保存)
json_data = json.dumps(data)
print(json_data)  # 出力: {"name": "John", "age": 30, "pets": ["cat", "dog"]}

# jsonを使ってデータをデシリアライズ(読み込み)
loaded_data = json.loads(json_data)
print(loaded_data)  # 出力: {'name': 'John', 'age': 30, 'pets': ['cat', 'dog']}


csvモジュール

csvモジュールは、CSV(Comma Separated Values)形式のファイルの読み書きを容易に行うための機能を提供します。CSV形式のデータは、スプレッドシートやデータベースのデータをテキスト形式で保存する際に広く使われており、異なるソフトウェア間でデータを移行する際の一般的な中間形式としても使用されます。

import csv

# CSVデータを書き込む
with open('sample.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(["SN", "Name", "Contribution"])
    writer.writerow([1, "Linus Torvalds", "Linux Kernel"])
    writer.writerow([2, "Tim Berners-Lee", "World Wide Web"])

# CSVデータを読み込む
with open('sample.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)


sqlite3モジュール

sqlite3モジュールは、SQLiteデータベースとのインタラクションを提供します。SQLiteはファイルベースの軽量データベースで、SQLインターフェースを介してデータを操作します。Pythonの標準ライブラリには、SQLiteデータベースへの接続やSQLコマンドの実行、トランザクション管理などの基本的な機能を提供するsqlite3モジュールが含まれています。

import sqlite3

# メモリ上に新しいデータベースを作成する
conn = sqlite3.connect(':memory:')

# カーソルオブジェクトを作成する
cur = conn.cursor()

# 新しいテーブルを作成する
cur.execute('''CREATE TABLE stocks
               (date text, trans text, symbol text, qty real, price real)''')

# データを挿入する
cur.execute("INSERT INTO stocks VALUES ('2023-07-07','BUY','RHAT',100,35.14)")

# データベースに対する変更をコミットする
conn.commit()

# データを選択し、出力する
cur.execute("SELECT * FROM stocks WHERE trans='BUY'")
print(cur.fetchall())

# 接続を閉じる
conn.close()


threadingモジュール

threadingモジュールは、軽量プロセスであるスレッドの作成と管理を提供します。スレッドは、複数のタスクを並行して実行することを可能にする手段です。同じプロセス内のすべてのスレッドは、メモリと他のリソースを共有します。

import threading
import time

# スレッドで実行する関数を定義します。
def print_numbers():
    for i in range(10):
        time.sleep(1)
        print(i)

def print_letters():
    for letter in 'abcdefghij':
        time.sleep(1.5)
        print(letter)

# 各関数を新しいスレッドで実行します。
t1 = threading.Thread(target=print_numbers)
t2 = threading.Thread(target=print_letters)

# スレッドを開始します。
t1.start()
t2.start()

# 主スレッドは、t1とt2が終了するまで待機します。
t1.join()
t2.join()


multiprocessingモジュール

multiprocessingモジュールは、プロセスベースの並列実行を提供します。それぞれのプロセスが独自のPythonインタープリターとメモリ空間を持つため、multiprocessingはグローバルインタープリターロック(GIL)の制限を回避し、CPUコアを最大限に活用することを可能にします。

import multiprocessing
import time

# プロセスで実行する関数を定義します。
def print_numbers():
    for i in range(10):
        time.sleep(1)
        print(i)

def print_letters():
    for letter in 'abcdefghij':
        time.sleep(1.5)
        print(letter)

# 各関数を新しいプロセスで実行します。
p1 = multiprocessing.Process(target=print_numbers)
p2 = multiprocessing.Process(target=print_letters)

# プロセスを開始します。
p1.start()
p2.start()

# 主プロセスは、p1とp2が終了するまで待機します。
p1.join()
p2.join()


concurrent.futuresモジュール

concurrent.futuresモジュールは、高レベルなインターフェースを提供し、非同期実行をより容易に扱うことができます。具体的には、スレッドとプロセスを抽象化したExecutorオブジェクトを使用して、関数を非同期に実行します。

from concurrent.futures import ThreadPoolExecutor
import time

# 各スレッドで実行する関数を定義します。
def print_numbers():
    for i in range(10):
        time.sleep(1)
        print(i)

def print_letters():
    for letter in 'abcdefghij':
        time.sleep(1.5)
        print(letter)

# ThreadPoolExecutorを使用して各関数を新しいスレッドで実行します。
with ThreadPoolExecutor(max_workers=2) as executor:
    executor.submit(print_numbers)
    executor.submit(print_letters)


socketモジュール

socketモジュールは、Pythonの標準ライブラリの中でネットワーク通信を担当しています。主にTCP/IPを介したクライアントとサーバー間のデータ送受信が可能です。socketモジュールを使用すると、低レベルのネットワーク接続を作成、管理することができます。

import socket

# socketオブジェクトを作成します。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# ローカルホストのポート12345にバインドします。
s.bind(('localhost', 12345))

# クライアントからの接続を待機します。
s.listen(1)
print("サーバーがクライアントからの接続を待機しています。")

# クライアントからの接続があったときに接続を確立します。
c, addr = s.accept()
print("クライアントから接続がありました:", addr)

# クライアントにメッセージを送信します。
c.send(b'Thank you for connecting')

# 接続を閉じます。
c.close()


socketモジュール

socketモジュールは、Pythonの標準ライブラリの中でネットワーク通信を担当しています。主にTCP/IPを介したクライアントとサーバー間のデータ送受信が可能です。socketモジュールを使用すると、低レベルのネットワーク接続を作成、管理することができます。

サーバ側のコード

import socket

# socketオブジェクトを作成します。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# ローカルホストのポート12345にバインドします。
s.bind(('localhost', 12345))

# クライアントからの接続を待機します。
s.listen(1)
print("サーバーがクライアントからの接続を待機しています。")

# クライアントからの接続があったときに接続を確立します。
c, addr = s.accept()
print("クライアントから接続がありました:", addr)

# クライアントにメッセージを送信します。
c.send(b'Thank you for connecting')

# 接続を閉じます。
c.close()

クライアント側のコード

import socket

# socketオブジェクトを作成します。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# サーバーのポート12345に接続します。
s.connect(('localhost', 12345))

# サーバーからのメッセージを受信します。
print(s.recv(1024))

# 接続を閉じます。
s.close()


emailモジュール

emailモジュールは、電子メールを作成、操作、解析するためのクラスと関数を提供します。これはMIME(Multipurpose Internet Mail Extensions)や他のRFC 2822に基づくメッセージ構造を処理するためのもので、一部のユーティリティはメッセージヘッダーのエンコードとデコードも提供します。

from email.mime.text import MIMEText
from email.header import Header

# メールの本文を作成
msg = MIMEText('こんにちは、Pythonからのメールです!', 'plain', 'utf-8')

# メールのヘッダーを設定
msg['From'] = Header('from@example.com', 'utf-8')    # 送信者
msg['To'] = Header('to@example.com', 'utf-8')        # 受信者
msg['Subject'] = Header('Pythonからのテストメール', 'utf-8')  # 件名

# メールの本文とヘッダーを表示
print(msg.as_string())


http.clientモジュール

http.clientモジュールは、HTTPプロトコルを用いたクライアントサイドのネットワーク通信を提供します。このモジュールを使用すると、PythonからHTTPリクエストを作成し、サーバーからのHTTPレスポンスを受け取ることができます。

import http.client

# HTTP接続を開始します
conn = http.client.HTTPSConnection("www.python.org")

# GETリクエストを送信します
conn.request("GET", "/")

# レスポンスを取得します
response = conn.getresponse()

# レスポンスのステータスと本文を表示します
print(response.status, response.reason)
print(response.read().decode())

# 接続を閉じます
conn.close()


urllib.requestモジュール

urllib.requestモジュールは、URLを開くための拡張可能なライブラリを提供します。このモジュールを使用すると、URLからデータを取得したり、特定のURLにデータを送信したりすることができます。

import urllib.request

# URLを指定してリクエストを開く
response = urllib.request.urlopen('http://www.python.org')

# レスポンスのステータスを表示する
print('Response:', response)

# ヘッダー情報を表示する
print('Header:')
print(response.info())

# レスポンスの本文を表示する
print('Body:')
print(response.read().decode())


pdbモジュール

pdbモジュールは、Pythonプログラムのデバッグを行うためのインタラクティブな環境を提供します。pdbはPythonデバッガの略で、コードをステップバイステップで実行したり、任意の時点でプログラムの実行を一時停止して状態を確認したりすることができます。

import pdb

def calculate_sum(n):
    total = 0
    for i in range(n):
        pdb.set_trace()  # デバッグのブレークポイントを設定
        total += i
    return total

print(calculate_sum(10))


timeitモジュール

timeitモジュールは、小さなビットのPythonコードの実行時間を計測するための機能を提供します。これは、パフォーマンスの比較や最適化のために特に役立ちます。

import timeit

# 実行時間を計測したいコードを文字列として提供
code_to_test = """
a = [1, 2, 3]
a = [x**2 for x in a]
"""
# timeit関数を用いてコードの実行時間を計測
elapsed_time = timeit.timeit(code_to_test, number=10000)  # number引数はコードを実行する回数を表します。
print(elapsed_time)


traceモジュール

traceモジュールは、Pythonプログラムの実行時に行のトレースまたはコールグラフを生成するためのツールを提供します。これは、プログラムの動作を詳しく理解するためや、デバッグを支援するために役立ちます。

まずはexample.pyという名前のPythonスクリプトを作成し、以下のようなコードを書きます。

# example.py
def recursive_function(n):
    if n == 0:
        return
    print(n)
    return recursive_function(n - 1)

recursive_function(5)

次に、traceモジュールを使ってこのスクリプトをトレースします。

python -m trace --trace example.py

これを実行すると、example.pyスクリプトが行う全ての関数呼び出しと行の実行を表示します。それぞれの行の前には、現在実行中のファイル名、行番号、関数名が表示されます。


distutilsモジュール

distutilsモジュールは、Pythonコードをパッケージ化し、そのパッケージをビルド、インストール、または配布するためのツールを提供します。これにより、他の開発者があなたのコードを簡単に使用できるようにするための手段が提供されます。

基本的な使い方は、setup.pyという名前のスクリプトを作成し、distutils.coreからsetup関数を使ってパッケージのメタデータを定義するというものです。

以下に、基本的なsetup.pyの例を示します。

from distutils.core import setup

setup(
    name='HelloWorld',  # パッケージ名
    version='1.0',  # バージョン
    description='A simple example',  # 説明
    author='Your Name',  # あなたの名前
    author_email='yourname@example.com',  # あなたのメールアドレス
    url='http://www.example.com',  # プロジェクトのホームページ
    packages=['helloworld'],  # パッケージを含むディレクトリのリスト
)

このスクリプトを実行すると、HelloWorldパッケージがビルドされ、インストールや配布の準備が整います。

なお、Pythonのディストリビューションツールとしては、現在はより新しいsetuptoolsが推奨されており、distutilsは非推奨とされています。より高度な機能を持つsetuptoolsの使用を検討してみてください。

setuptoolsには、依存関係の自動解決、Pythonパッケージインデックス(PyPI)へのアップロード機能、エントリーポイント(コマンドラインツールの自動生成)など、distutilsにはない多くの便利な機能があります。


venvモジュール

venvモジュールは、Python仮想環境を作成するためのモジュールです。仮想環境は、Pythonインタープリタ、ライブラリ、スクリプトがあるディレクトリを指す一般的な用語です。これは、異なるプロジェクトで異なるライブラリのバージョンを使用する必要がある場合などに便利です。各仮想環境は、他の仮想環境から分離されており、特定のプロジェクトの依存関係を管理するのに役立ちます。

Python 3.3以降、venvモジュールは標準ライブラリに含まれています。

以下に、venvモジュールを使って新しい仮想環境を作成し、その環境を有効にする手順を示します。このコードはコマンドラインから実行します。

# 仮想環境の作成
python3 -m venv myenv

# 仮想環境の有効化 (Windowsの場合)
myenv\Scripts\activate

# 仮想環境の有効化 (Unix or MacOSの場合)
source myenv/bin/activate

上記のコマンドは、myenvという名前の新しい仮想環境を作成します。そして、その仮想環境を有効にします。

仮想環境を有効にすると、Pythonインタープリタとして仮想環境のものが使用され、新たにインストールするPythonパッケージもこの仮想環境内にインストールされます。

仮想環境を無効にするには、コマンドラインで次のように入力します。

deactivate

これで、仮想環境が無効化され、元の環境に戻ります。


sysモジュール

sysモジュールは、Pythonの実行環境に関する情報を提供し、操作するためのモジュールです。sysモジュールを使用すると、コマンドライン引数を取得したり、Pythonのパスを管理したり、Pythonインタープリタを終了したりすることができます。

import sys

# コマンドライン引数の取得
print("スクリプト名:", sys.argv[0])
print("引数リスト:", sys.argv[1:])

# 初期パス
for path in sys.path:
    print(path)

# パスを追加
sys.path.append("/my/new/path")

# 新しいパスを追加後
for path in sys.path:
    print(path)

# Pythonインタプリタの終了
sys.exit(1)


gcモジュール

gcモジュールは、Pythonのガーベジコレクション(GC)機構を操作するためのインターフェイスを提供します。ガーベジコレクションとは、プログラムが動的に確保したメモリが不要になったときに自動的に解放する機能を指します。Pythonのgcモジュールは、特に循環参照の解決に重要な役割を果たします。

import gc

print("GC enabled:", gc.isenabled())  # GCの状態をチェック
gc.disable()  # GCを無効化
print("GC enabled:", gc.isenabled())
gc.enable()  # GCを再有効化
print("GC enabled:", gc.isenabled())

print("Before collection, garbage:", len(gc.garbage))  # GC前のガベージの数
collected = gc.collect()  # GCを手動実行
print("Collected objects:", collected)  # GCにより解放されたオブジェクトの数
print("After collection, garbage:", len(gc.garbage))  # GC後のガベージの数

objects = gc.get_objects()
print("Number of objects:", len(objects))  # 追跡しているオブジェクトの数


inspectモジュール

inspectモジュールは、Pythonのオブジェクトに関する情報を取得するための高度な機能を提供します。これは、プログラムの実行中にオブジェクトがどのように動作するかを調べるのに非常に便利なツールです。たとえば、関数の引数、クラスのメソッド、ソースコードの状態などを取得することができます。

import inspect

def my_function(a, b, c=5):
    pass

# 関数のシグネチャを取得
sig = inspect.signature(my_function)
print("Parameters:", sig.parameters)

# 関数のソースコードを取得
print(inspect.getsource(my_function))

# 関数であるかどうかチェック
print("Is a function:", inspect.isfunction(my_function))
# クラスであるかどうかチェック
print("Is a class:", inspect.isclass(my_function))


練習問題1.

randomモジュールを使用して、1から10までの数字をランダムに選んで表示するプログラムを作成してください。


練習問題2.

datetimeモジュールを使用して、現在の日時を以下の形式で表示するプログラムを作成してください

年-月-日 時:分:秒


練習問題3.

osモジュールを使用して、現在の作業ディレクトリの全ファイルとディレクトリの一覧を取得し、それを表示するプログラムを作成してください。