ã·ã§ã«ã¹ã¯ãªããã®ä»£ããã«Pythonã使ã
ããã¾ã§ãéçºãéç¨æã«ä½¿ããã¡ãã£ã¨ããã³ãã³ãã©ã¤ã³ãã¼ã«ãèªååã¹ã¯ãªããã¯ã主ã«Bashã®ã·ã§ã«ã¹ã¯ãªããã§å®è£ ãã¦ããã®ã§ãããæè¿ãã®ãããªç¨éã«ã¯Pythonã使ãããã«ãã¦ãã¾ãã
- Bashã¹ã¯ãªããã¸ã®ä¸æº
- ã¹ã¯ãªããã®å®è£ æ¹é
- ãã¼ã¿ããªãã£éè¦ã®ããã®ç¸ãPythonããã°ã©ãã³ã°
- Tips
- ãã使ãã¹ãããã
- æåã«è²ãã¤ãã
- 赤ãæåã§ã¨ã©ã¼ã¡ãã»ã¼ã¸ãåºåãã¦çµäºãã
- å¤é¨ã³ãã³ãå®è¡ãã
- ããã¹ãããã¡ã¤ã«ã«åºåãã
- ãã¡ã¤ã«ã«å®è¡æ¨©éãã¤ãã
- ã¹ã¯ãªããã®åæãå¤éèµ·å鲿¢ãã
- ã³ãã³ãã©ã¤ã³ã»ãªãã·ã§ã³ã®è§£æ
- HTTPãªã¯ã¨ã¹ã
- ã¾ã¨ã
Bashã¹ã¯ãªããã¸ã®ä¸æº
Bashã®ã¹ã¯ãªããå®è£ ã«ããã¦ã以ä¸ã®ãããªä¸æºãããã¾ããã
- ã¯ã©ã¹ã
飿³é åããªãã®ã§ãæ§é åãããã¼ã¿ãæ±ãã¥ããã - JSONããã¼ã¹ã§ããªããjqãªã©ã®ã·ã¹ãã ã«ããã©ã«ãã§ã¤ã³ã¹ãã¼ã«ããã¦ããªãã³ãã³ããå¿ è¦ã
- åºæ¬ãã³ãã³ãã®çµã¿åããã§ãã¸ãã¯ãæ¸ãã¦ããã®ã ããMacã¨Linuxã§æåãå¾®å¦ã«ç°ãªãã³ãã³ããããããã®ããæãã¬ç°å¢ä¾åã§ããããã¨ãããã
- 颿°ã®æ»ãå¤ãæ°å¤ããè¿ããªãã®ã§ãçµæãæååã§æ¬²ããã¨ãã¯ãæ¨æºåºåã¨ãã¤ãã使ããªã©ãããããç´°ãããã¯ããã¯ãå¿ è¦ã
追è¨: 飿³é åã¯bashã«ãããã¨ã³ã¡ã³ãããã£ãã®ã§ä¿®æ£ãã¾ããã調ã¹ãããã¼ã¸ã§ã³4ããããããµãã¼ããããããã§ãã
ã¡ãªã¿ã«Bashã¹ã¯ãªãããæ¸ãä¸ã§ã®ãã¯ããã¯ã¯ãrbenvã¨herokuã®buildpackã®å®è£ ãåèã«ãªãã¾ãã
rbenv
: https://github.com/rbenv/rbenvheroku-buildpack-php
: https://github.com/heroku/heroku-buildpack-php
ã¾ãã以ä¸ã¯æã¾ã¨ããBashãã¼ãã·ã¼ãã§ãã
ã¨ããããããç¨åº¦è¤éãªå®è£ ã«ãªã£ã¦ããã¨ãBashã ã¨ããã°ã©ãã³ã°è¨èªã¨ãã¦ã®æ©è½ãè²§å¼±ãªã®ã§ãã¤ãããã®ãããã¾ãã
ã¹ã¯ãªããã®å®è£ æ¹é
ç§ãã¹ã¯ãªãããæ¸ãéã®ãå®è£ ã®åºæ¬æ¹éã¯ä»¥ä¸ã®ãããªãã®ã§ãã
- Macã§ãLinux(主ã«CentOS)ã§ãåä½ããã
- ãªãã¹ããã·ã¹ãã ã«æ¨æºã§ã¤ã³ã¹ãã¼ã«ããã¦ããã³ãã³ã以å¤ã«ä¾åããªãã
- ãªãã¹ãã1ãã¡ã¤ã«ã§å®è£ ããã
-h
ãªãã·ã§ã³ã§ãã«ãã¡ãã»ã¼ã¸è¡¨ç¤ºã«å¯¾å¿ããã¦ãå¿ è¦ãªããã¥ã¡ã³ããå å ãããã
è¦ã¯ãMacä¸ã§å®è£ ããããã¯ãã¦ãLinuxãµã¼ãä¸ã§ä½¿ãå ´åã¯ãã¹ã¯ãªãããã¡ã¤ã«ä¸åãç½®ãã°åä½ãããããã«ä½ãããããã§ããPythonã¯Macã«ãCentOSã«ãããã©ã«ãã§å ¥ã£ã¦ããããæ¨æºã©ã¤ãã©ãªãè±å¯ãªã®ã§ããã®ãããªãã¼ã¿ããªãã£éè¦ã®ã¹ã¯ãªããè¨è¿°ã«åãã¦ããã¨æãã¾ããã
ãã¼ã¿ããªãã£éè¦ã®ããã®ç¸ãPythonããã°ã©ãã³ã°
Pythonã§ã¹ã¯ãªãããå®è£ ãã¦ããä¸ã§ãåè¿°ã®ãã¼ã¿ããªãã£ã確ä¿ãããããããã¤ãçæãã¹ãå¶éãããã¾ãã
- Pythonã®ãã¼ã¸ã§ã³2ç³»ã¨3ç³»ã©ã¡ãã§ããåä½ããããã«æ¸ãã
- å¤é¨ããã±ã¼ã¸ã使ããªãã
ç¾å¨ã®Pythonã®ä¸»æµã¯ãã¼ã¸ã§ã³3ç³»ãªã®ã§ãåºæ¬ã¯3ç³»ã®ã³ã¼ããæ¸ãã¾ããããããMacãCentOSã«ããã©ã«ãã¤ã³ã¹ãã¼ã«ããã¦ããPythonã¯2ç³»ãªã®ã§ããã¡ãã§ãåãããã«ãé©å®ã¯ã¼ã¯ã¢ã©ã¦ã³ããå ¥ãã¦ãæ¸ãã¾ããã¨ã¯ããã大ããããªã¢ããªã±ã¼ã·ã§ã³ãæ¸ãããã§ã¯ãªãã®ã§ãããã¾ã§é£ãããã®ã§ã¯ããã¾ãããå¤é¨ããã±ã¼ã¸ã使ããªãã¨ããç¸ãã¯ãåºæ¬çã«å®è£ ã1ãã¡ã¤ã«ã§æ¸ã¾ãããããã§ããããã¾ã§ãã·ã§ã«ã¹ã¯ãªããã®ä»£æ¿ã¨ãã¦ä½¿ããããã¨ããã®ãä»åã®ç®çã§ãã
Tips
以ä¸ãèæ¯ã«ãå®éã«Pythonã§ã¹ã¯ãªãããæ¸ãéã«ä½¿ã£ã¦ããTipsãç´¹ä»ãã¾ãã
__future__
ã¢ã¸ã¥ã¼ã«ã§ãã¼ã¸ã§ã³2ã3両æ¹ã«å¯¾å¿ããã
__future__
ã¢ã¸ã¥ã¼ã«ã以ä¸ã®ããã«ãã¦ã¤ã³ãã¼ããã¾ããåã
ã®ä»æ§ã®è©³ç´°ã¯ãããå¿ãã¦ãã¾ãã¾ãããã3ç³»ã®ã³ã¼ããã2ç³»ã®ã©ã³ã¿ã¤ã ã§ã使ç¨ã§ããããã«ãããã®ã§ããä»ã¯ä½ãèããããã¾ããªãã®ããã«ãã¹ã¯ãªããã®æåã«å¿
ãè¨è¿°ããæãã§ãã
from __future__ import division, print_function, absolute_import, unicode_literals
ãã¼ã¸ã§ã³2ã3ã§ç°ãªãã¢ã¸ã¥ã¼ã«ããåãååã§èªã¿è¾¼ã
ConfigParserã¯ãiniãã¡ã¤ã«å½¢å¼ã®è¨å®ãã¡ã¤ã«ãæ±ãããã®æ¨æºã¢ã¸ã¥ã¼ã«ã§ãã Bashã§ã¯é£ãããæ§é åãããå¤é¨è¨å®ãã¡ã¤ã«ãæ±ããã®ã§ã便å©ã§ãããã 2ç³»ã¨3ç³»ã§ã¢ã¸ã¥ã¼ã«ã®ååãå¤ãã£ã¦ããã®ã§ã以ä¸ã®ããã«ãã¦ãæåã«3ç³»ã®ã¢ã¸ã¥ã¼ã«ãimportã失æããã2ç³»ãimportããããã«ãã¦ã¾ããããã§ä¸¡æ¹ã®ãã¼ã¸ã§ã³ã§åãããã«ã¢ã¸ã¥ã¼ã«ã使ç¨ã§ãã¾ãã
try: import configparser as ConfigParser except ImportError: # fallback for python2 import ConfigParser config = ConfigParser.RawConfigParser() config.read("/path/to/configfile.conf")
ãã¼ã¸ã§ã³2ã3ãå¤å¥ãã颿°ãç¨æãã
ã©ããã¦ã2ç³»ã¨3ç³»ã§ãå¦çãåãåããå¿
è¦ãã§ã¦ããå ´åãããã¾ãããã®ããããã¼ã¸ã§ã³ãå¤å¥ã§ãã颿°ãå®ç¾©ãã¦ããã¨ä¾¿å©ã§ãã以ä¸ã®ããã«runtime
ã¯ã©ã¹ã®ã¹ã¿ãã£ãã¯ã¡ã½ããã¨ãã¦å®è£
ãã¾ãã
class runtime: @staticmethod def v3(): return sys.version_info >= (3,) @staticmethod def v2(): return sys.version_info < (3,) if runtime.v3(): # ãã¼ã¸ã§ã³3ç³»ã®ã¨ãã®å¦çãæ¸ã...
ãã使ãã¹ãããã
ã³ãããã¦ä½¿ã£ã¦ããã¹ãããããããã¤ãç´¹ä»ãã¾ããå
¨ã¦ãæ¨æºã¢ã¸ã¥ã¼ã«ã®ã¿ã«ä¾åããã³ã¼ãã§ããé©å®import os
ãimport subprocess
ãªã©ã®ããã«ãäºåã«å¿
è¦ãªã¢ã¸ã¥ã¼ã«ããã¼ããã¦ä½¿ãã¾ãã
æåã«è²ãã¤ãã
class colors: bold = '\033[1m' underlined = '\033[4m' black = '\033[30m' red = '\033[31m' green = '\033[32m' yellow = '\033[33m' blue = '\033[34m' magenta = '\033[35m' cyan = '\033[36m' lightgray = '\033[37m' darkgray = '\033[90m' lightred = '\033[91m' lightgreen = '\033[92m' lightyellow = '\033[93m' lightblue = '\033[94m' lightmagenta = '\033[95m' lightcyan = '\033[96m' background_black = '\033[40m' background_red = '\033[41m' background_green = '\033[42m' background_yellow = '\033[43m' background_blue = '\033[44m' background_magenta = '\033[45m' background_cyan = '\033[46m' reset = '\033[0m' # ä½¿ãæ¹ print(colors.red + "red text" + colors.reset)
赤ãæåã§ã¨ã©ã¼ã¡ãã»ã¼ã¸ãåºåãã¦çµäºãã
åè¿°ã®colors
ã¯ã©ã¹ã使ãã¾ãã
def abort(s): print(colors.red + s + colors.reset, file=sys.stderr) sys.exit(1) abort("error!")
å¤é¨ã³ãã³ãå®è¡ãã
ã·ã§ã«ã¹ã¯ãªããã®ä»£æ¿ã¨ãã¦ã®Pythonãªã®ã§ãå¤é¨ã³ãã³ãå®è¡ã¯ãã»ã¼å¿
ã使ãã¾ããsubprocess.check_output
ã使ãã¨ãç°¡åã«ã³ãã³ãå®è¡ãã¦æ¨æºåºåãåå¾ã§ãã¾ãã
ãã®ã¡ã½ããã®æ»ãå¤ã¯2ç³»ã¨3ç³»ã§ç°ãªãã®ã§ãåè¿°ã®rumtime
ã¯ã©ã¹ã«ãããã¼ã¸ã§ã³å¤å®ã使ã£ã¦ã以ä¸ã®ããã«å©ç¨ãã¾ãã
out = subprocess.check_output("ls -la", shell=True).strip() if runtime.v3(): out = out.decode('utf-8')
ããã¹ãããã¡ã¤ã«ã«åºåãã
fd = open("/path/to/file", 'w') fd.write("""#!/usr/bin/env bash set -e echo "generated by Python" """) fd.close()
ãã¡ã¤ã«ã«å®è¡æ¨©éãã¤ãã
umask = os.umask(0) os.chmod("/path/to/file", 0o755) os.umask(umask)
ã¹ã¯ãªããã®åæãå¤éèµ·å鲿¢ãã
try: fd = open(__file__, 'r') fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) except IOError: print("Another process is using: " + os.path.basename(__file__), file=sys.stderr) sys.exit(1)
ã³ãã³ãã©ã¤ã³ã»ãªãã·ã§ã³ã®è§£æ
argparse
ã¢ã¸ã¥ã¼ã«ã§ã§ãã¾ãã以ä¸ã¯æå°ã®ãµã³ãã«ã§ãã
import argparse parser = argparse.ArgumentParser( description="cli application description", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" additional description... """ ) parser.add_argument("-V", "--version", dest="version", action="store_true", help="Print the version.") args = parser.parse_args() if args.version: print("v0.0.1") sys.exit(0)
ããã ãã§-h
ãªãã·ã§ã³ã§ããã«ãã¡ãã»ã¼ã¸ã表示ã«å¯¾å¿ããã³ãã³ããã§ãã¾ããepilog
ã«ä½¿ãæ¹ãªã©ãæ¸ãã°ãã¡ãã£ã¨ããããã¥ã¡ã³ã代ããã«ãªãã¾ãã
ã»ãã«ããgitã®ãããªãµãã³ãã³ãã®ä½æã«ã対å¿ãã¦ãã¦ãBashã«æ¯ã¹ãã¨ãã¨ã¦ã便å©ã§ãã
HTTPãªã¯ã¨ã¹ã
以ä¸ã¯ãgithubã®apiãããå ¬ééµãåå¾ãããµã³ãã«ãã¤ãã§ã«Bashã§ã¯é£ãããJSONã®ãã¼ã¹ãã
#!/usr/bin/env python from __future__ import division, print_function, absolute_import, unicode_literals try: from urllib.request import urlopen, Request from urllib.error import HTTPError except ImportError: # fallback for python2 from urllib2 import urlopen, Request, HTTPError import json import sys class runtime: @staticmethod def v3(): return sys.version_info >= (3,) @staticmethod def v2(): return sys.version_info < (3,) def main(): res = urlopen("https://api.github.com/users/kohkimakimoto/keys") body = res.read() if runtime.v3(): body = body.decode('utf-8') keys = json.loads(body) for key in keys: print(key['key']) if __name__ == '__main__': main()
ã¾ã¨ã
Bashããæ ¼æ®µã«ä¾¿å©ã§ããpipãªã©ã§å¤é¨ããã±ã¼ã¸ã使ããªãã¦ããã¡ãã£ã¨ããèªååã¹ã¯ãªãããªãå åã«ãã¼ã§ãã¾ãã