UP | HOME

модуль 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.

Author: Pavel Vavilin

Created: 2017-10-25 Wed 22:11

Validate