ひぐぺん工房トップへ おかげさまで28周年!

ひぐぺん工房(松浦健一郎・司ゆき) - HigPen Works
Follow @higpenworks
・今までの仕事 ・書籍 ・最近の業務 ・対応可能言語 ・お見積

『Python[完全]入門』
Q&A

以下の回答で問題が解決しなかった場合には、 こちらから ご連絡ください。

訂正


2021/01/17
Q.ファイルアップロード機能(Chapter15, p.551)
A.
bottle2.pyで例外(TypeError)が発生し、アップロードした画像ファイルが表示されない場合があるようです。申し訳ありません。bottle2.pyを以下のように修正してください。
  修正前:return bottle.static_file(file)
  修正後:return bottle.static_file(file, root='.')
また、bottle2.pyを実行する前に、uploadedディレクトリを作成しておいてください。

2021/03/31
Q.Excelワークブックへの書き込み(Chapter12, p.456)
A.
excel2.pyについて、紙面に掲載したプログラムに誤りがありました。申し訳ありません。
サンプルファイルには正しいexcel2.pyのプログラムが収録されていますので、ご利用ください。
excel2.pyは以下のように修正してください。
  修正前:book = openpyxl.load_workbook()
  修正後:book = openpyxl.Workbook()

2021/03/31
Q.関数の引数(Chapter6, p.263-264)
A.
varargs4.pyとonly8.pyについて、紙面に掲載したプログラムに誤りがありました。申し訳ありません。
サンプルファイルには正しいvarargs4.pyおよびonly8.pyのプログラムが収録されていますので、ご利用ください。
varargs4.pyは以下のように修正してください。
  修正前:for i, x in enumerate(t, start=1):
  修正後:for i, x in enumerate(t, 1):
only8.pyは以下のように修正してください。
  2行目:
    修正前:for i, x in enumerate(t, 1):
    修正後:for i, x in enumerate(t, start):
  4行目:
    修正前:for i, (k, v) in enumerate(d.items(), len(t)+1):
    修正後:for i, (k, v) in enumerate(d.items(), len(t)+start):

2021/07/13
Q.macOS/LinuxにおけるCGIプログラムの実行(Chapter15, p.544)
A.
macOS/Linuxにおいてlogin.pyが動作しない問題がありました。申し訳ありません。
login.pyを動作させるには、以下の修正が必要です。
  1. login.pyの1行目に「#!/usr/bin/env python3」を追加します。
    これはシバン(shebang、シェバン)と呼ばれる記述で、ファイルを解釈して実行するためのインタプリタを指定します。この場合はenvコマンドを使ってpython3コマンドを検索した上で、インタプリタとして使います。なお「#!/usr/bin/env python」と記述するとPython 2が使用されるので、「#!/usr/bin/env python3」と書くのがおすすめです。
  2. login.pyの改行コードをCR+LFではなくLFにします。
    CR+LFはWindowsで使われる改行コードで、LFはmacOS/Linuxで使われる改行コードです。
  3. login.pyの属性を実行可能にします。
    chapter15/cgi-binディレクトリにおいて、「chmod 755 login.py」か「chmod 700 login.py」を実行します。chmodはファイルの属性を変更するコマンドです。
上記の1と2について修正済みのサンプルファイルも用意しましたので、ご利用ください。このサンプルファイルを使う場合も、上記の3については作業が必要です。

Pythonのプログラムにシバンを記述する必要があるのは、この例のようにCGIプログラムとして使用する場合や、Pythonのプログラムを直接実行したい場合です。例えば、Pythonのプログラムにシバンを書いた上で、ファイルの属性を実行可能にすれば、「python3 Pythonプログラムのファイル名」とせずに「Pythonプログラムのファイル名」とするだけで、直接実行することができます。これはPythonを使ってコマンドやツールを作成したいときに便利です。

補足


2021/07/13
Q.sys.stdout.detachの効果(Chapter15, p.544)
A.
detachはio.TextIOBaseクラスio.BufferedIOBaseクラスのメソッドです。これらのクラスには、根底にあるストリーム(データが流れる経路)に対して、エンコーディングやバッファリングといった機能を追加する働きがあります。

print関数の出力は、sys.stdout(標準出力)に出力されます。sys.stdoutは、上記のio.TextIOBaseクラスの派生クラスであるio.TextIOWrapperクラスのインスタンスなので、エンコーディングの機能があります。しかし、CGIプログラムでそのままsys.stdoutを利用すると、環境によって文字化けする場合があります。

そこでdetachメソッドを使います。detachメソッドには、io.TextIOBaseクラスやio.BufferedIOBaseクラスから、根底にあるストリームを切り離す働きがあります。本書のlogin.pyでは、detachメソッドを使ってstd.stdoutの根底にあるストリームを切り離します。そして、codecs.getwriterメソッドを使ってcodecs.StreamWriterクラスと組み合わせることで、指定したエンコーディング(utf-8)で出力を行うストリームを作成します。

最後に、作成したストリームをstd.stdoutに代入することで、std.stdoutを作成したストリームに置き換えます。これでprint関数の出力は、作成したストリーム(utf-8で出力するストリーム)に出力されるようになり、文字化けを防ぐことができます。

2022/04/07
Q.打ち込んだプログラムが動かないとき
A.
打ち込んだ(手作業で入力した)プログラムが動かないときには、以下をお試しください。
  1. p.45「本書のサンプルファイルを実行するには」の手順に沿って、まずはサンプルファイルに収録されたプログラムを、そのまま実行してみてください。例えばChapter5の「while1.py」(p.227)を実行するには、手順の(4)を「cd chapter5」に、手順の(5)を「python while1.py」にします。
  2. 上記が実行できた場合には、収録されたプログラムと、打ち込んだプログラムのどこが違うのかを比較します。p.46で紹介しているツール(fcやdiff)などを使って、両者の違いを調べ、打ち込んだプログラムを修正してください。特に、インデントは見た目では区別がつかないので注意してください。打ち込んだプログラムにおいて、インデントに半角空白やタブ以外の文字、例えば全角空白を使っていないかどうかを確かめてください。
  3. 収録されたプログラムと打ち込んだプログラムが同じなのに実行できない場合には、正しいファイルを実行しているかどうかを確認してください。プログラムのファイルを数多く作成すると、編集しているファイルと、実行しているファイルが違っていた(ファイルの保存場所が間違っていて、編集しているファイルとは別のファイルを実行していた)ということがときどき起きます。Windowsの場合はコマンドプロンプトで「type ….py」を、macOS/Linuxの場合はターミナルで「cat ….py」を実行すると、ファイル「….py」の内容を表示できるので、正しいファイルかどうかを確かめてください。

2022/09/13
Q.:(コロン)の意味(p.34など)
A.
「for i in range(10):」などの末尾にある「:」は、一部の構文において、区切りを表すために使われる記号です。if・elif・else・while・for(以上Chapter5)、def(Chapter6)、class(Chapter7)、try・except・else・finally(Chapter8)といった構文で使われます。これらの「:」は文法上必要なので、本書に記載されている使い方の通りに入力してみてください。

2023/02/02
Q.VS Codeでsql5.pyを実行すると「Exception has occurred: SystemExit…」と表示される(Chapter15, p.539)
A.
VS Codeでsql5.pyを実行すると、「Exception has occurred: SystemExit…」(例外が発生した:SystemExit…)と表示されることがあります。これはsql5.pyがsys.exit関数を使ってプログラムを終了した際に、VS Codeのデバッガが例外として認識し、エラーを表示するためです。プログラム(sql5.py)としては正常な動作なのですが、VS Codeにてエラーを表示させないためには、以下のいずれかをお試しください。

2023/02/20
Q.Jupyter Notebookで「Permission denied」と表示される(Chapter2, p.36)
A.
Jupyter Notebookでノートブックを作成または保存する際に、「Permission denied」と表示される場合は、例えば以下の原因が考えられます。
対処としては、以下をお試しください。

2023/03/02
Q.input関数の戻り値は文字列(Chapter5, p.196)
A.
input関数の戻り値は文字列です(p.196, p.370)。input関数の戻り値を計算に使う場合は、int関数(p.90, p.378)で整数に変換したり、float関数(p.92, p.378)で浮動小数点数に変換してから、計算を行います。

2023/04/12
Q.macOSにおけるAnacondaの動作(p.25)
A.
以下の環境でAnacondaが動作することを確認しました。
インストールと動作確認の手順は下記です。
  1. Anacondaをダウンロードします。
  2. インストーラを実行し、デフォルトの設定でインストールします。
  3. ターミナルを起動します(既に起動している場合には、新しく起動します)。
  4. 「(base) ユーザ名@マシン名 ~ %」のように、プロンプトの先頭に「(base)」と表示されていれば、Anacondaが使用できます。
  5. 例えば「conda list」を実行すると、インストールされているパッケージの一覧が表示されます。
もし、ターミナルでプロンプトの先頭に「(base)」と表示されない場合は、Anacondaを使用するための設定ができていない可能性があります。ターミナルを新しく起動したり、Anacondaを再インストールしたりしてみてください。

Anacondaのインストーラは、~/.bash_profile(ログイン時の設定ファイル)に、Anacondaを使用するために必要な設定を書き込みます(「# >>> conda initialize >>>…」などと記述されています)。Anacondaが正しく使用できない(例えば「zsh: command not found: conda」などと表示される)場合には、~/.bash_profileにAnacondaの設定が記述されているかどうかを、「cat ~/.bash_profile」などでご確認ください。設定が記述されていない場合は、Anacondaを再インストールしてみてください。

2023/04/18
Q.Gmailによるメールの送信(Chapter12, p.466)
A.
Gmailによるメールの送信(初版第6刷以降)について、以下の環境で動作を確認しました。mail1.py(p.468)、mail2.py(p.469)ともに、正常に動作しています。
本書p.466の手順に沿って「2段階認証プロセス」と「アプリパスワード」を設定します。2段階認証の手段は、デフォルトの「音声またはテキストメッセージ」を選択し、「2段階認証プロセスの電話番号」を設定しました。「再設定用の電話番号」と「再設定用のメールアドレス」は未設定です。

mail1.pyとmail2.pyには、例えば以下のような接続情報を設定します。PASSにはGmailのパスワードではなく、アプリパスワードを設定することに注意してください。

SERVER = 'smtp.gmail.com'
FROM = 'abc@gmail.com'
TO = 'def@ghi.jkl'
PASS = 'abcdefghijklmnop'

2023/05/17
Q.「import openpyxl」を実行すると「ModuleNotFoundError」が表示される(Chapter12, p.455)
A.
コマンドプロンプトで「pip install openpyxl」を実行して、インストールに成功したけれども、「import openpyxl」を実行すると「ModuleNotFoundError」が表示される…という場合には、以下をご確認ください。
  1. コマンドプロンプトで「pip list」を実行し、インストール済みのモジュールを確認します。もし「openpyxl」が含まれていなければ、再度「pip install openpyxl」を実行してください。
  2. CPythonとAnacondaを併用している場合には、両者の設定が競合している可能性も考えられます。CPythonまたはAnacondaのいずれかをアンインストールして片方だけを使うか、両者の最新版を再インストールしてみてください。
以下の環境において、CPythonおよびAnacondaのいずれにおいても、openpyxlのインストール(p.454)と、excel1.pyの実行(p.455)が正しく行えることを確認しました。「ModuleNotFoundError」の発生は確認できませんでした。CPythonとAnacondaのインストール方法は、本書のChapter1に基づいています。

2023/07/25
Q.文字列の前にあるfの意味(Chapter5, p.220)
A.
文字列の前にあるfは、フォーマット済み文字列リテラル(Chapter9, p.376)を意味します。簡潔な記法で、文字列に値を埋め込めます。

2023/11/10
Q.WebサーバのURL(Chapter15, p.543)
A.
http.serverモジュールのWebサーバに接続する際には、「https://localhost:8000/」ではなく、「http://localhost:8000/」をWebブラウザで開いてください。近年のインターネットでは、安全性のためHTTPSプロトコルが広く使われていますが、http.serverモジュールは手元のコンピュータにおけるプログラムの開発を主目的にしていることもあり、HTTPSには対応しておらず、HTTPのみに対応しています。そのため、URLの先頭は「https」ではなく「http」にしてください。

2024/04/09
Q.schedule1.pyの実行時に「ModuleNotFoundError: No module named 'scraping'」と表示される(Chapter14, p.529)
A.
schedule1.py(p.529)はscraping.py(p.528)をモジュールとして利用しています。もし上記のエラーが表示される場合は、以下の条件を満たしているかどうかをご確認ください。 Python 3.11.7とコマンドプロンプトを使って、以下の手順で正常に動作することを確認しました。例えばJupyter NotebookやVisual Studio Codeなどをお使いの場合は、開発環境の特性(カレントディレクトリの違いなど)が原因で動作しない可能性もあります。以下の手順と同じ環境で、一度お試しください。
  1. コマンドプロンプトを起動する。
  2. schedule1.pyとscraping.pyが存在するフォルダをカレントディレクトリにする。
  3. schedule1.pyを「python schedule1.py」のように実行する。
上記の1と2については、エクスプローラでschedule1.pyとscraping.pyが存在するフォルダを開き、右クリックメニューから「ターミナルで開く」を実行する方法もあります。

最終更新 2024/04/09
トップページへ
©ひぐぺん工房 禁無断転載
最新刊『Java[完全]入門』 
このサイトはリンクフリーです。
このサイトはChromeで動作検証しています。ブラウザにかかわらず表示に乱れがありましたらどうぞお知らせ下さい。メールを送る