ã©ã€ãã©ãªãšæ¡åŒµ FAQ¶
ã©ã€ãã©ãªäžè¬ã®è³ªå¶
äœæ¥ X ãè¡ãããã®ã¢ãžã¥ãŒã«ãã¢ããªã±ãŒã·ã§ã³ãæ¢ãã«ã¯ã©ãããŸããïŒÂ¶
ã©ã€ãã©ãªãªãã¡ã³ã¬ã¹ ããé¢ä¿ããããããªæšæºã©ã€ãã©ãªã¢ãžã¥ãŒã«ããããã©ãã調ã¹ãŠãã ããã (æšæºã©ã€ãã©ãªã«äœãããããåããããã«ãªããšããã®æ®µéãã¹ãããããããšãã§ããŸãã)
ãµãŒãããŒãã£ã®ããã±ãŒãžã«ã€ããŠã¯ãPython Package Index ãæ¢ããããGoogle ãã®ä»ã® web ãµãŒããšã³ãžã³ã詊ããŠãã ããã"Python" ã«å ããŠäžã€ãäºã€ã®ããŒã¯ãŒãã§èå³ã®ãã話é¡ãæ€çŽ¢ããã°ããããŠã圹ã«ç«ã€ãã®ãèŠã€ããã§ãããã
math.py (socket.py, regex.py, etc.) ã®ãœãŒã¹ãã¡ã€ã«ã¯ã©ãã«ãããŸããïŒÂ¶
ã¢ãžã¥ãŒã«ã®ãœãŒã¹ãã¡ã€ã«ãèŠä»ããããªãå Žåã¯ããã㯠C ã C++ ããããã¯å¥ã®ã³ã³ãã€ã«èšèªã§å®è£
ãããããã«ãã€ã³ãããã¯åçã«èªã¿èŸŒãŸããã¢ãžã¥ãŒã«ãããããŸããããã®å ŽåããœãŒã¹ã¯æã«å
¥ããªããããããŸãããã mathmodule.c ã®ãããªãã®ã (Python ã®èªã¿èŸŒã¿ãã¹ã«ç¡ã) C ãœãŒã¹ãã£ã¬ã¯ããªã®ã©ããã«ãããããããŸããã
Python ã®ã¢ãžã¥ãŒã«ã«ã¯ã(å°ãªããšã) 3 çš®é¡ãããŸã:
Python ã§æžãããã¢ãžã¥ãŒã« (.py)ã
C ã§æžãããåçã«ããŒããããã¢ãžã¥ãŒã« (.dll, .pyd, .so, .sl, etc)ã
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() ã«æž¡ããŠæžã蟌ã¿å¯èœã調ã¹ãããšãã§ããŸãã
ããŒã¿ããŒã¹Â¶
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 ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãçæããŠãè€æ°ã®ç¬ç«ãªä¹±æ°çæåšãã€ããããšãã§ããŸãã