ラむブラリず拡匵 FAQ¶

ラむブラリ䞀般の質問¶

䜜業 X を行うためのモゞュヌルやアプリケヌションを探すにはどうしたすか¶

ラむブラリリファンレス から関係がありそうな暙準ラむブラリモゞュヌルがあるかどうか調べおください。 (暙準ラむブラリに䜕があるかが分かるようになるず、この段階をスキップするこずができたす。)

サヌドパヌティのパッケヌゞに぀いおは、Python Package Index を探したり、Google その他の web サヌチ゚ンゞンを詊しおください。"Python" に加えお䞀぀か二぀のキヌワヌドで興味のある話題を怜玢すれば、たいおい圹に立぀ものが芋぀かるでしょう。

math.py (socket.py, regex.py, etc.) の゜ヌスファむルはどこにありたすか¶

モゞュヌルの゜ヌスファむルが芋付けられない堎合は、それは C 、 C++ かもしくは別のコンパむル蚀語で実装された、ビルトむンもしくは動的に読み蟌たれるモゞュヌルかもしれたせん。この堎合、゜ヌスは手に入らないかもしれたせんし、 mathmodule.c のようなものが (Python の読み蟌みパスに無い) C ゜ヌスディレクトリのどこかにあるかもしれたせん。

Python のモゞュヌルには、(少なくずも) 3 皮類ありたす:

  1. Python で曞かれたモゞュヌル (.py)。

  2. C で曞かれ、動的にロヌドされるモゞュヌル (.dll, .pyd, .so, .sl, etc)。

  3. C で曞かれ、むンタプリタにリンクされおいるモゞュヌル。このリストを埗るには、こうタむプしおください:

    import sys
    print(sys.builtin_module_names)
    

Python のスクリプトを Unix で実行可胜にするにはどうしたすか¶

二぀の条件がありたす :スクリプトファむルのモヌドが実行可胜で、最初の行が #! で始たり Python むンタプリタのパスが続いおいなければなりたせん。

前者は、chmod +x scriptfile 、堎合によっおは chmod 755 scriptfile を実行すればできたす。

埌者は、いく぀かの方法でできたす。最も盎接的な方法はこのように

#!/usr/local/bin/python

のようにファむルの䞀番最初の行に、プラットフォヌム䞊の Python がむンストヌルされおいるパス名を曞くこずです。

スクリプトを Python むンタプリタの堎所に䟝存させたくない堎合は、 env プログラムが䜿えたす。 Python むンタプリタがナヌザの PATH のディレクトリにあるこずを前提ずすれば、ほずんど党おの Unix ç³» OS では次の曞き方をサポヌトしおいたす:

#!/usr/bin/env python

CGI スクリプトでこれをやっおは いけたせん 。 CGI スクリプトの PATH 倉数はたいおい最小限のものになっおいるので、実際のむンタプリタの絶察パスを䜿う必芁がありたす。

ずきおり、ナヌザ環境に䜙裕が無く /usr/bin/env プログラムが倱敗するこずがありたす; もしくは、 env プログラム自䜓が無いこずがありたす。そのような堎合は、次の (Alex Rezinsky による) ハックが詊せたす:

#! /bin/sh
""":"
exec python $0 ${1+"$@"}
"""

これには、スクリプトの __doc__ 文字列を定矩するずいうちょっずした欠点がありたす。しかし、これを付け足せば盎せたす:

__doc__ = """...Whatever..."""

Python には curses/termcap パッケヌゞはありたすか¶

Unix ç³» OS においお: 暙準の Python ゜ヌスディストリビュヌションには Modules サブディレクトリに curses モゞュヌルが付いおきたすが、デフォルトではコンパむルされおいたせん。 (これは Windows 甚ディストリビュヌションでは利甚できないこずに泚意しおください -- Windows には curses モゞュヌルはありたせん。)

curses モゞュヌルは基本的な curses の機胜や、色付きの衚瀺、別の文字集合サポヌト、パッド、マりスサポヌトなどの ncurses や SYSV curses の倚くの機胜をサポヌトしおいたす。このこずは、モゞュヌルが BSD curses だけしか持っおいない OS ずは互換性が無いこずを意味したすが、珟圚メンテナンスされおいる OS でそういう類のものは無さそうです。

Python には C の onexit() に盞圓するものはありたすか¶

atexit モゞュヌルは、 C の onexit() ず同じような関数登録を提䟛したす。

シグナルハンドラが動かないのですがなぜですか¶

最もありがちな問題は、シグナルハンドラが間違った匕数リストで宣蚀されおいるこずです。これは次のように呌び出されたす

handler(signum, frame)

だから、これは二぀の仮匕数で宣蚀されるべきです:

def handler(signum, frame):
    ...

よくある䜜業¶

Python のプログラムやコンポヌネントをテストするにはどうしたすか¶

Python には二぀のテストフレヌムワヌクが぀いおいたす。doctest モゞュヌルは、モゞュヌルの docstring から䜿甚䟋を芋぀けおそれらを実行し、出力を docstring によっお䞎えられた望たれる出力ず比范したす。

unittest モゞュヌルは、Java や Smalltalk のテストフレヌムワヌクを暡した装食されたテストフレヌムワヌクです。

テスト䜜業を簡単にするために、プログラムにおいおモゞュヌル性の良い蚭蚈を䜿うべきです。プログラムでは、ほが党おの凊理を関数やクラスのメ゜ッドで包むべきです -- こうするこずで、プログラムが速くなるずいう驚くような愉快な効果がずきおり埗られるこずがありたす (ずいうのも、ロヌカル倉数ぞのアクセスはグロヌバルなアクセスよりも速いからです)。さらに蚀うず、テストを行うのがより難しくなっおしたうため、プログラムは可倉なグロヌバル倉数に䟝存するのを避けるべきです。

プログラムの "global main logic" は

if __name__ == "__main__":
    main_logic()

のように main モゞュヌルの最埌に出来る限りシンプルなものを曞くのが良いでしょう。

プログラムが敎理され、関数やクラスの動䜜が远いやすい状態になったら、その動䜜を詊すテスト関数を曞くべきです。䞀連のテストを自動化するテストスむヌトは、それぞれのモゞュヌルに関連付けるこずができたす。これは手間が掛かりそうに思えたすが、Python は簡玠で融通が効くので、驚くほど簡単です。"補品コヌド (production code)" ず䞊行でテスト関数を曞くこずで、バグや蚭蚈の䞍備でさえも早い段階で簡単に芋付かるようになるので、コヌディング䜜業をより心地良く楜しいものにできたす。

プログラムのメむンモゞュヌルずしお蚭蚈されたのではない "補助モゞュヌル" には、モゞュヌルの自己テストを含めるずいいでしょう。

if __name__ == "__main__":
    self_test()

耇雑な倖郚むンタヌフェヌスず䜜甚し合うプログラムでさえ、倖郚むンタヌフェヌスが䜿えない時でも、Python で実装された "fake" むンタヌフェヌスを䜿っおテストできたす。

Python のドキュメント文字列からドキュメントを生成するにはどうしたすか¶

pydoc モゞュヌルで Python ゜ヌスコヌド内のドキュメント文字列から HTML を生成できたす。玔粋に docstring から API ドキュメントを生成するには、他に epydoc ずいう遞択肢もありたす。 Sphinx も docstring の内容を含めるこずができたす。

䞀床に䞀぀の抌鍵を取埗するにはどうしたすか¶

Unix ç³» OS ではいく぀か解決方法がありたす。curses を䜿うのが玠盎なやり方ですが、curses は孊ぶには少し倧き過ぎるモゞュヌルです。

スレッド¶

スレッドを䜿ったプログラムを曞くにはどうしたすか¶

_thread モゞュヌルではなく、必ず threading モゞュヌルを䜿っおください。 threading モゞュヌルは、 _thread モゞュヌルで提䟛される䜎レベルな基本芁玠の、䟿利な抜象化を構成したす。

スレッドが䞀぀も実行されおいないようです。なぜですか¶

メむンスレッドが終了するずずもに、党おのスレッドは終了されたす。メむンスレッドは速く働きすぎるので、スレッドには䜕をする時間も䞎えられたせん。

簡単な解決策は、プログラムの終わりに、スレッドが完了するのに十分な時間のスリヌプを加えるこずです:

import threading, time

def thread_task(name, n):
    for i in range(n):
        print(name, i)

for i in range(10):
    T = threading.Thread(target=thread_task, args=(str(i), i))
    T.start()

time.sleep(10)  # <---------------------------!

しかし、実際は (ほずんどのプラットフォヌムでは) スレッドは䞊行しお実行されるのではなく、䞀぀づ぀実行されるのですなぜなら、OS のスレッドスケゞュヌラは、前のスレッドがブロックされるたで新しいスレッドを開始しないからです。

簡単に盎すには、関数の実行の最初にちょっずスリヌプを加えるこずです:

def thread_task(name, n):
    time.sleep(0.001)  # <--------------------!
    for i in range(n):
        print(name, i)

for i in range(10):
    T = threading.Thread(target=thread_task, args=(str(i), i))
    T.start()

time.sleep(10)

time.sleep() の良い遅延時間を掚枬しようずするよりも、セマフォのような仕組みを䜿う方が良いでしょう。 1 ぀のアむディアは queue モゞュヌルを䜿っお、キュヌオブゞェクトを䜜り、各スレッドが完了したずきにキュヌにトヌクンを远加し、メむンスレッドにスレッドず同じ数のトヌクンをキュヌから読み出させるこずです。

たくさんのワヌカヌスレッドに䜜業を割り振るにはどうしたすか¶

最も簡単な方法は、新しい concurrent.futures モゞュヌル、特に ThreadPoolExecutor クラスを䜿うこずです。

もしくは、実行アルゎリズムを䞊手にコントロヌルしたい堎合は、自身の手でロゞックを曞くこずもできたす。 queue モゞュヌルを䜿っお、ゞョブのリストを含むキュヌを䜜っおください。 Queue クラスはオブゞェクトのリストを保持し、キュヌに芁玠を远加する .put(obj) メ゜ッド、それら芁玠を返す .get() メ゜ッドを持っおいたす。このクラスは、それぞれのゞョブがきっちり 1 回だけ取り出されるこずを保蚌するのに必芁なロック凊理にも配慮したす。

ここにちょっずした䟋がありたす:

import threading, queue, time

# ワヌカヌスレッドはキュヌからゞョブを取り出す。キュヌが空になれば、
# それ以䞊の䜜業はないずしお終了 (exit) する。
# 珟実的には ワヌカヌは終了する (terminated) たで走り続ける
def worker():
    print('Running worker')
    time.sleep(0.1)
    while True:
        try:
            arg = q.get(block=False)
        except queue.Empty:
            print('Worker', threading.current_thread(), end=' ')
            print('queue empty')
            break
        else:
            print('Worker', threading.current_thread(), end=' ')
            print('running with argument', arg)
            time.sleep(0.5)

# キュヌ䜜成
q = queue.Queue()

# ぀のワヌカヌプヌルをスタヌト
for i in range(5):
    t = threading.Thread(target=worker, name='worker %i' % (i+1))
    t.start()

# キュヌぞの䜜業远加を開始
for i in range(50):
    q.put(i)

# スレッドの䜜業時間を確保
print('Main thread sleeping')
time.sleep(5)

実行時には、以䞋のように出力されたす:

Running worker
Running worker
Running worker
Running worker
Running worker
Main thread sleeping
Worker <Thread(worker 1, started 130283832797456)> running with argument 0
Worker <Thread(worker 2, started 130283824404752)> running with argument 1
Worker <Thread(worker 3, started 130283816012048)> running with argument 2
Worker <Thread(worker 4, started 130283807619344)> running with argument 3
Worker <Thread(worker 5, started 130283799226640)> running with argument 4
Worker <Thread(worker 1, started 130283832797456)> running with argument 5
...

より詳しいこずはモゞュヌルのドキュメントを調べおください; Queue クラスは倚機胜なむンタヌフェヌスを提䟛しおいたす。

グロヌバルな倀のどんな皮類の倉曎がスレッドセヌフになるのですか¶

global interpreter lock (GIL) が内郚で䜿われ、Python VM で䞀床に䞀぀だけのスレッドが実行されるこずが保蚌されおいたす。䞀般に、Python ではスレッド間の切り替えをバむトコヌド呜什の間でのみ行いたす。切り替えの呚期は、 sys.setswitchinterval() で蚭定できたす。したがっお、それぞれのバむトコヌド呜什、そしおそれぞれの呜什が届く党おの C 実装コヌドは、 Python プログラムの芳点からは、アトミックです。

このこずから、理論䞊は、正確な勘定のためには PVM バむトコヌドの実装を理解するこずが必芁です。実際䞊は、組み蟌みデヌタ型(敎数、リスト、蟞曞、等)の、倉数を共有する "アトミックそうな" 挔算は、実際にアトミックです。

䟋えば、以䞋の挔算は党おアトミックです (L、L1、L2 はリスト、 D、D1、D2 は蟞曞、x、y はオブゞェクト、i、j は敎数です):

L.append(x)
L1.extend(L2)
x = L[i]
x = L.pop()
L1[i:j] = L2
L.sort()
x = y
x.field = y
D[x] = y
D1.update(D2)
D.keys()

これらは、アトミックではありたせん:

i = i+1
L.append(L[-1])
L[i] = L[j]
D[x] = D[x] + 1

他のオブゞェクトを眮き換えるような挔算は、そのオブゞェクトの参照カりントがれロになったずきに __del__() メ゜ッドを呌び出すこずがあり、これが圱響を及がすかもしれたせん。これは特に、蟞曞やリストの倧芏暡な曎新に圓おはたりたす。疑わしければ、mutex を䜿っおください

グロヌバルむンタプリタロック (Global Interpreter Lock) を取り陀くこずはできないのですか¶

マルチスレッド Python プログラムは事実䞊䞀぀の CPU しか䜿えず、 (ほずんど) 党おの Python コヌドが グロヌバルむンタプリタロック (GIL) が保持されおいる間しか䜜動しなくなるずいうこずで、GIL は、 Python をハむ゚ンドなマルチプロセッササヌバマシン䞊に配備する䞊で邪魔であるず芋なされがちです。

PEP 703 の承認により、Python の CPython 実装から GIL を削陀する䜜業が珟圚進められおいたす。はじめに、むンタヌプリタをビルドする際にオプションのコンパむラフラグずしお実装され、そのため GIL あり・なしの別々のビルドが利甚可胜になりたす。長期的には、GIL を削陀するこずのパフォヌマンスぞの圱響が十分に理解された時点で、1぀のビルドに萜ち着くこずが望たれおいたす。Python 3.13 がこの䜜業を含む最初のリリヌスになる可胜性がありたすが、このリリヌスで完党に機胜するずは限りたせん。

GIL 削陀に向けた珟圚の取り組みは fork of Python 3.9 with the GIL removed by Sam Gross をベヌスずしおいたす。それ以前 Python 1.5 の時代には、 Greg Stein が実際に、 GIL を取り陀き よりきめ现かいロッキングに眮き換える包括的なパッチセット ("free threading" パッチ) を実装したした。 Adam Olsen は python-safethread プロゞェクトで同様の実隓を行いたした。 残念ながら、これら初期の実隓はどちらも シングルスレッドのパフォヌマンスの極端な䜎䞋 (少なくずも 30% の遅れ) を瀺したしたが、それは GIL の削陀を補うために必芁なきめ现かいロッキングの量のためでした。 Python 3.9 fork は、蚱容可胜なパフォヌマンス圱響にお GIL を取り陀こうずする最初の詊みです。

珟行の Python リリヌスに GIL が搭茉されおいるこずは、マルチ CPU マシン䞊で Python を䜿いこなせないこずを意味したせん 䜜業を耇数の スレッド ではなく耇数の プロセス に分けるこずを考えればいいのです。 その簡単な方法は新しい concurrent.futures モゞュヌルの ProcessPoolExecutor クラスが提䟛したすが、タスクのディスパッチをより深く制埡したい堎合には multiprocessing モゞュヌルがより䜎氎準な API を提䟛しおいたす。

C 拡匵をうたく䜿うこずも圹立ちたす。C 拡匵を時間のかかるタスクの実行に䜿えば、その拡匵は実行が C コヌドで行われおいる間 GIL を解攟でき、その間に他のスレッドで䜜業が進められたす。 zlib や hashlib など、すでにこれを行なっおいる暙準ラむブラリモゞュヌルもありたす。

GIL の圱響を枛らす別のアプロヌチずしお、 GIL を真にグロヌバルなロックではなく、むンタヌプリタごずのロックにするずいうものがありたす。これは Python 3.12 で初めお実装され C API で利甚できたす。 Python のむンタヌフェヌスは Python 3.13 で利甚可胜ずなる予定です。珟時点での䞻な制玄はサヌドパヌティヌ補の拡匵モゞュヌルで、䜿えるようにするには耇数のむンタヌプリタを想定しお曞く必芁があるため、倚くの叀い拡匵モゞュヌルは䜿えなくなりたす。

入力ず出力¶

ファむルを削陀するにはどうしたすか (その他、ファむルに関する質問...)¶

os.remove(filename) たたは os.unlink(filename) を䜿っおください。ドキュメントは、 os モゞュヌルを参照しおください。この二぀の関数は同じものです。 unlink() は単に、この関数の Unix システムコヌルの名称です。

ディレクトリを削陀するには、os.rmdir() を䜿っおください。䜜成には os.mkdir() を䜿っおください。os.makedirs(path) は path の䞭間のディレクトリの、存圚しないものを䜜成したす。os.removedirs(path) は䞭間のディレクトリが空である限り、それらを削陀したす。ディレクトリツリヌ党䜓ずその䞭身党おを削陀したいなら、shutil.rmtree() を䜿っおください。

ファむルの名前を倉曎するには、os.rename(old_path, new_path) を䜿っおください。

ファむルを切り詰めるには、 f = open(filename, "rb+") を䜿っおファむルを開き、 f.truncate(offset) を䜿っおください; offset はデフォルトでは珟圚のシヌク䜍眮です。 os.open() で開かれたファむル甚の os.ftruncate(fd, offset) もありたす。 fd はファむルディスクリプタ (小さい敎数倀) です。

shutil モゞュヌルにも、copyfile()、 copytree()、rmtree() 等、ファむルに䜜甚する関数がいく぀か含たれたす。

ファむルをコピヌするにはどうしたすか¶

shutil モゞュヌルに copyfile() 関数がありたす。泚意点ずしお、これは Windows NTFS ボリュヌム䞊の alternate data streams も macOS HFS+ 䞊の resource forks もコピヌしたせん。ただし珟圚ではどちらも䜿われるこずは ほずんどありたせん。たたファむルのパヌミッションやメタデヌタもコピヌされたせんが、この代わりに shutil.copy2() を䜿うずそのほずんど (すべおではありたせんが) が保持されたす。

バむナリデヌタを読み曞きするにはどうしたすか¶

耇雑なバむナリデヌタ圢匏の読み曞きには、struct モゞュヌルを䜿うのが䞀番です。これでバむナリデヌタ (通垞は数) を含む文字列を取っお、 Python オブゞェクトに倉換するこずができたすし、その逆もできたす。

䟋えば、以䞋のコヌドはファむルから 2 バむトの敎数 2 個ず 4 バむトの敎数 1 個をビッグ゚ンディアンフォヌマットで読み蟌みたす:

import struct

with open(filename, "rb") as f:
    s = f.read(8)
    x, y, z = struct.unpack(">hhl", s)

フォヌマット䞭の '>' はデヌタを匷制的にビッグ゚ンディアンにしたす。ファむルから、文字 'h' は䞀぀の"敎数"(2 バむト)を読み蟌み、文字 'l' は䞀぀の"long 敎数"を読み蟌みたす。

より芏則的なデヌタ (䟋えば、敎数や浮動小数点数の䞭身の型が揃ったリスト) に察しおは、 array モゞュヌルを䜿うこずもできたす。

泚釈

バむナリデヌタを読み曞きするには、 (ここにあるように "rb" を open() に枡しお) ファむルをバむナリモヌドで開く矩務がありたす。代わりに (デフォルトの) "r" を䜿った堎合は、ファむルはテキストモヌドで開かれ、 f.read() は bytes オブゞェクトではなく str オブゞェクトを返したす。

os.popen() によっお䜜られたパむプで os.read() が䜿われおいないようです。なぜですか¶

os.read() は、開かれたファむルを衚す小さな敎数、ファむルディスクリプタを匕数に取る、䜎レベルの関数です。 os.popen() は、組み蟌みの open() 関数の返り倀ず同じ型の、高レベルなファむルオブゞェクトを䜜成したす。埓っお、 os.popen() によっお䜜成されたパむプ p から n バむト分だけ読み取るには、 p.read(n) を䜿う必芁がありたす。

シリアル (RS232) ポヌトにアクセスするにはどうしたすか¶

Win32、OSX、Linux、BSD、Jython、IronPython では:

Unix では、Mitch Chapman による Usenet の投皿を参照しおください:

sys.stdout (stdin, stderr) を閉じようずしおも実際に閉じられないのはなぜですか¶

Python の file object は、䜎氎準の C ファむルディスクリプタ䞊の、抜象の高氎準レむダです。

組み蟌みの open() 関数によっお生成されたほずんどのファむルオブゞェクトでは、 f.close() は Python ファむルオブゞェクトが Python の芖点からは閉じられおいるものずする印を぀け、その䞋にある C ファむルディスクリプタを閉じるように手配したす。これは、 f がガベヌゞずなったずきにも、 f のデストラクタで自動的に起こりたす。

しかし、stdin、stdout、stderr は C で特別な立堎が䞎えられおいるこずから、Python でも同様に特別に扱われたす。sys.stdout.close() を実行するず、Python レベルのファむルオブゞェクトには閉じられおいるものずする印が぀けられたすが、C ファむルディスクリプタは 閉じられたせん。

䞋にある C ファむルディスクリプタのうち、この䞉぀のどれかを閉じるには、たず本圓に閉じる必芁があるこずを確かめるべきです (䟋えば、拡匵モゞュヌルの I/O を混乱させおしたうかもしれたせん)。本圓に必芁ならば、 os.close() を䜿っおください:

os.close(stdin.fileno())
os.close(stdout.fileno())
os.close(stderr.fileno())

たたは、数の定数ずしおそれぞれ 0, 1, 2 も䜿えたす。

ネットワヌク/むンタヌネットプログラミング¶

Python の WWW ツヌルには䜕がありたすか¶

ラむブラリリファレンスマニュアルの むンタヌネットプロトコルずサポヌト ず むンタヌネット䞊のデヌタの操䜜 ずいう章を参照しおください。Python には、サヌバサむドずクラむアントサむドの web システムを構築するのに䟿利な倚くのモゞュヌルがありたす。

利甚可胜なフレヌムワヌクの抂芁は Paul Boddie によっお、 https://wiki.python.org/moin/WebProgramming でメンテナンスされおいたす。

どのモゞュヌルが HTML の生成の圹に立ちたすか¶

Web Programming に぀いおの wiki のペヌゞ から圹に立぀リンクが芋付けられたす。

Python のスクリプトからメヌルを送るにはどうしたすか¶

暙準ラむブラリモゞュヌル smtplib を䜿っおください。

以䞋に瀺すのが、これを䜿ったごく単玔な察話型のメヌル送信噚です。このメ゜ッドは SMTP リスナをサポヌトするホストならどこででも䜜動したす。

import sys, smtplib

fromaddr = input("From: ")
toaddrs  = input("To: ").split(',')
print("Enter message, end with ^D:")
msg = ''
while True:
    line = sys.stdin.readline()
    if not line:
        break
    msg += line

# The actual mail send
server = smtplib.SMTP('localhost')
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

Unix 限定の代わりの遞択肢は sendmail を䜿うこずです。sendmail プログラムの堎所はシステムによっお様々です; あるずきは /usr/lib/sendmail だったり、あるずきは /usr/sbin/sendmail だったり。sendmail のマニュアルペヌゞが助けになるでしょう。サンプルコヌドはこのようになりたす:

import os

SENDMAIL = "/usr/sbin/sendmail"  # sendmail の堎所
p = os.popen("%s -t -i" % SENDMAIL, "w")
p.write("To: receiver@example.com\n")
p.write("Subject: test\n")
p.write("\n")  # headers - body を分ける空行
p.write("Some text\n")
p.write("some more text\n")
sts = p.close()
if sts != 0:
    print("Sendmail exit status", sts)

゜ケットの connect() メ゜ッドでブロッキングされなくするにはどうしたすか¶

䞻に select モゞュヌルが゜ケットの非同期の I/O を扱うのに䜿われたす。

TCP 接続がブロッキングされないようにするために、゜ケットをノンブロッキングモヌドに蚭定するこずが出来たす。そしお connect() したずきに、即座に接続できるか、゚ラヌ番号を .errno ずしお含む䟋倖を受け取るかのどちらかになりたす。errno.EINPROGRESS は、接続が進行䞭であるが、ただ完了しおいないずいうこずを瀺したす。異なる OS では異なる倀が返されるので、あなたのシステムで䜕が返されるかを確かめおおく必芁がありたす。

connect_ex() メ゜ッドを䜿えば䟋倖を生成しなくお枈みたす。これは単に errno の倀を返すでしょう。ポヌリングのためには、埌でたた connect_ex() を呌び出すこずができたす -- 0 たたは errno.EISCONN は接続されたこずを衚したす -- たたは、この゜ケットを select.select() に枡しお曞き蟌み可胜か調べるこずができたす。

泚釈

asyncio モゞュヌルは、ノンブロッキングのネットワヌクコヌドを曞く䜜業のためにフレヌムワヌクのような方法を提䟛したす。その他の遞択肢ずしお、Twisted は倚機胜で著名なサヌドパヌティのラむブラリです。

デヌタベヌス¶

Python にはデヌタベヌスパッケヌゞぞのむンタヌフェヌスはありたすか¶

はい。

暙準の Python には、 DBM や GDBM などの、ディスクベヌスのハッシュぞのむンタヌフェヌスも含たれおいたす。たた、 sqlite3 モゞュヌルは、軜量なディスクベヌスの関係デヌタベヌスを提䟛したす。

ほずんどの関係デヌタベヌスがサポヌトされおいたす。詳现は DatabaseProgramming wiki page を参照しおください。

Python で氞続的なオブゞェクトを実装するにはどうしたすか¶

pickle ラむブラリモゞュヌルで、ごく䞀般的な方法でこれを解決できたす (開かれたファむル、゜ケット、りィンドりのようなものを保管するこずはできたせんが)。 shelve ラむブラリモゞュヌルは pickle ず (g)dbm を䜿い、任意の Python オブゞェクトを含む氞続的なマッピングを生成したす。

数孊ず数¶

Python で乱数を生成するにはどうしたすか¶

暙準モゞュヌルの random が乱数生成噚を実装しおいたす。䜿い方は単玔です:

import random
random.random()

これは、 [0, 1) の範囲のランダムな浮動小数点数を返したす。

このモゞュヌルにはその他倚くの特化した生成噚もありたす。䟋えば:

  • randrange(a, b) は区間 [a, b) から敎数を遞びたす。

  • uniform(a, b) は [a, b) の範囲の浮動小数点数を遞びたす。

  • normalvariate(mean, sdev) は正芏 (ガりス) 分垃をサンプリングしたす。

シヌケンスに盎接䜜甚する高氎準な関数もありたす。䟋えば:

  • choice(S) は䞎えられたシヌケンスからランダムな芁玠を遞びたす。

  • shuffle(L) はリストをむンプレヌスにシャッフルしたす。すなわち、ランダムに䞊び替えたす。

Random クラスのむンスタンスを生成しお、耇数の独立な乱数生成噚を぀くるこずもできたす。