модуль os в Python
Table of Contents
1 Основные функции в модуле os
import os print("%s\n%s\n%s\n%s" % ( os.name, os.environ['SHELL'], # os.environ will print too much text # os.getlogin(), # bug in Python, better use pwd.getpwuid(os.getuid()).pw_name os.getpid(), os.uname(), ))
posix /bin/zsh 4299 posix.uname_result(sysname='Linux', nodename='e470', release='4.10.0-37-generic', version='#41~16.04.1-Ubuntu SMP Fri Oct 6 22:42:59 UTC 2017', machine='x86_64')
2 Аттрибуты файлов и директорий
import os print(os.access("/tmp", os.R_OK | os.W_OK)) print(os.access("/", os.W_OK)) print(os.access("/bin/bash", os.R_OK | os.X_OK))
True False True
import os import grp import stat def perm(st): is_dir = 'd' if stat.S_ISDIR(st.st_mode) else '-' d = {'7': 'rwx', '6': 'rw-', '5': 'r-x', '4': 'r--', '3': '-wx', '2': '-w-', '1': '--x', '0': '---'} p = str(oct(st.st_mode)[-3:]) return is_dir + ''.join(d.get(x, x) for x in p) filepath = "/tmp/test.txt" with open(filepath, "w") as f: s1 = os.stat(filepath) os.chdir("/tmp") print('test.txt' in os.listdir()) os.chmod(filepath, 2486) os.chown(filepath, s1.st_uid, os.getgroups()[0]) s2 = os.stat(filepath) print("before: %s\tafter: %s" % (perm(s1), perm(s2))) print("before: %s\tafter: %s" % ( grp.getgrgid(s1.st_gid).gr_name, grp.getgrgid(s2.st_gid).gr_name )) os.unlink(filepath)
True before: -rw-rw-r-- after: -rw-rw-rw- before: pimiento after: adm
3 Работа с процессами
import os if os.name == "nt": command = "dir" else: command = "ls -l" print(os.system(command))
total 532 -rw-rw-r-- 1 pimiento pimiento 28320 Oct 25 21:57 cast.html -rw-rw-r-- 1 pimiento pimiento 47680 Oct 25 21:00 c_structures.html -rw-r--r-- 1 pimiento pimiento 19451 Oct 25 21:00 c_structures.org -rw-rw-r-- 1 pimiento pimiento 17926 Oct 25 22:00 c_varargs.html -rw-r--r-- 1 pimiento pimiento 3343 Oct 25 22:00 c_varargs.org -rw-rw-r-- 1 pimiento pimiento 32268 Oct 25 22:00 decorators.html -rw-r--r-- 1 pimiento pimiento 8399 Oct 25 22:00 decorators.org -rw-rw-r-- 1 pimiento pimiento 16317 Oct 25 22:06 fish_rat_or_bird.html -rw-r--r-- 1 pimiento pimiento 2801 Oct 25 22:06 fish_rat_or_bird.org -rwxrwxr-x 1 pimiento pimiento 1822 Oct 25 22:05 index_generator.py -rw-rw-r-- 1 pimiento pimiento 2231 Oct 25 22:08 index.md -rw-r--r-- 1 pimiento pimiento 23742 Oct 25 22:07 linkers.org -rw-rw-r-- 1 pimiento pimiento 78052 Oct 11 2013 org-info.js -rw-r--r-- 1 pimiento pimiento 2549 Oct 25 22:08 pdftk_and_djvu.org -rw-rw-r-- 1 pimiento pimiento 21594 Oct 25 22:09 processes.html -rw-r--r-- 1 pimiento pimiento 8064 Oct 25 22:09 processes.org -rw-r--r-- 1 pimiento pimiento 3394 Oct 25 17:10 publish_to_blogger.org -rw-rw-r-- 1 pimiento pimiento 19211 Oct 25 22:10 python_collections.html -rw-r--r-- 1 pimiento pimiento 3282 Oct 25 22:10 python_collections.org -rw-rw-r-- 1 pimiento pimiento 43114 Oct 25 22:10 python_gc.html -rw-r--r-- 1 pimiento pimiento 14244 Oct 25 22:10 python_gc.org -rw-rw-r-- 1 pimiento pimiento 26972 Oct 25 22:10 python_gil.html -rw-r--r-- 1 pimiento pimiento 8462 Oct 25 22:10 python_gil.org -rw-rw-r-- 1 pimiento pimiento 29960 Oct 25 22:11 python_graphs.html -rw-r--r-- 1 pimiento pimiento 6016 Oct 25 22:11 python_graphs.org -rw-r--r-- 1 pimiento pimiento 29 Oct 25 17:10 python_logging.org -rw-r--r-- 1 pimiento pimiento 5485 Oct 25 22:11 python_os.org -rw-r--r-- 1 pimiento pimiento 404 Oct 25 17:10 r_base.org -rw-rw-r-- 1 pimiento pimiento 4487 Oct 25 17:08 solarized-dark.css -rw-r--r-- 1 pimiento pimiento 5319 Oct 25 17:10 unix_hardlink_symlink.org 0
3.1 Запуск нового процесса
import os import sys program = "echo" arguments = ["Hello and goodbye!"] os.execvp(program, (program,) + tuple(arguments))
Hello and goodbye!
import os def run(program, *args): pid = os.fork() if not pid: # child process os.execvp(program, (program,) + args) print("I'm parent") return os.wait()[0] run("echo", "Hello from fork!") print("goodbye")
Hello from fork! I'm parent goodbye
fork вернёт нулевой pid для нового процесса (возврат значения fork будет первым, что произойдёт в этом процессе) и не-нулевое значение для оригинального процесса. В случае с Windows надо пользоваться функцией spawn, так fork в Windows не поддерживается.
3.2 Python daemon
import os import time pid = os.fork() if pid: os._exit(0) # kill original print("daemon started") time.sleep(1) print("daemon terminated")
daemon started daemon terminated
Это очень примитивный пример демона на Python, так как необходимо ещё позаботиться о перенаправлении stdout и stderr в dev-null и о закрытии stdin. Необходимо позаботиться о вызове os.setpgrp чтобы сигналы, посланные процессу не вызывали проблем для нашего демона. О демонах в UNIX я напишу когда-нибудь отдельно и подробно, на основе книги APUE.