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

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

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

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

訂正


2020/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で出力するストリーム)に出力されるようになり、文字化けを防ぐことができます。

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