[module] 환경변수, os.environ, os.path, glob

markyang92·2021년 5월 16일
1

python

목록 보기
26/42
post-thumbnail

os

출처: https://devanix.tistory.com/304?category=271929
os module

  • 주의 from os import * 대신 import os로 사용해야한다.
    • 그래야 os.open()이 built-in open()을 가리는 것을 피할 수 있다.

os.system()

  • Bourn shell 기반으로 명령어 실행
import os

os.system("mkdir {}/workspace".format(og.getenv('HOME'))
# 즉, /bin/sh 로 실행하는 쉘 프로그램하나를 실행

bash shell 명령어 사용

  1. source, shopt와 같은 bash shell용 명령어를 사용하고 싶다.
    #!/bin/bash

  2. subprocess 모듈을 사용해야한다.
    subprocess 모듈 참고


os.getcwd()

import os

print( os.getcwd() )

--- 출력 ---
/Users/yangdonghyeon/workspace
  • 현재 코드가 실행되는 디렉토리까지 문자열

os.getpid()

import os

print( os.getpid() )

--- 출력 ---
59373
  • 내 실행 파이썬 스크립트의 PID 출력

os.chdir()

import os
print(os.getcwd()) #/Users/yangdonghyeon/workspace

os.chdir( os.getcwd()+'/scripts/src' )
print(os.getcwd()) #/Users/yangdonghyeon/workspace/scripts/src
  • 현재 워킹 디렉토리 변경

os.access(path, mode) : 허가권

  • 입력 받은 path에 대해서 mode에 해당하는 작업이 가능한지 여부 반환
  • modebit연산 가능
modedescription
os.F_OK해당 path의 존재 여부 확인
os.R_OK해당 path의 읽기 여부 확인
os.W_OK해당 path의 쓰기 여부 확인
os.X_OK해당 path의 실행 가능여부 확인




os.listdir(path)

  • path에 존재하는 파일과 디렉토리들의 리스트 반환


os.mkdir(path[,mode])

  • None 반환

os.makedirs(path[,mode])

  • 인자로 전달된 디렉토리를 재귀적 생성
    - 이미 **디렉토리가 생성**되어 있는 경우나 **권한이 없어 생성할 수 없는 경우**는 **예외**발생

os.readlink(path)

  • example
os.readlink('/etc/fonts/conf.d/70-yes-bitmaps.conf')
  • 결과
../conf.avail/70-yes-bitmaps.conf

os.remove(path), os.unlink(path)

  • 파일을 삭제한다.

os.rmdir(path)

  • 디렉토리를 삭제한다. 단 디렉토리는 비어 있어야한다.

os.removedirs(path)

  • 디렉토리를 연달아 삭제한다.

os.rename(src,dst)

  • src -> dst로 이름 변경하거나 이동한다.

os.renames(src,dst)

  • src -> dst로 이름 변경하거나 이동한다.
  • os.rename과 차이는 이동 시에 필요한 디렉터리들을 자동생성한다.

os.stat(path)

  • 경로에 해당하는 정보를 얻는다.
  • 아래 예제와 같이 순차적으로 protection, inode, device, link, user id, group id, size, last access time, last modified time, last change time 등을 나타낸다.

os.walk(path)

  • 하위 폴더for문으로 탐색
    • argument로 전달된 path에 대해서 3개 tuplereturn 한다.
      • root: 아래 처럼 처음 root 디렉토리
      • dirs : root에서 보이는 디렉토리
      • files : root에서 보이는 파일들
      • 알아서 쭉쭉 순회한다.
import os

if __name__ == "__main__":
    root_dir = "./test/"
    for (root, dirs, files) in os.walk(root_dir):
        print("root : " + root)
        if len(dirs) > 0:
            for dir_name in dirs:
                print("dir: " + dir_name)

        if len(files) > 0:
            for file_name in files:
                print("file: " + file_name)
# ----------------

root : ./test/
dir: folder1
dir: folder3
dir: folder2
file: file1.txt
root : ./test/folder1
file: file2.txt
root : ./test/folder3
dir: folder4
file: file5.txt
file: file6.txt
root : ./test/folder3/folder4
file: text3.txt
file: text2.txt
file: text.txt
root : ./test/folder2
file: file3.txt
file: file4.txt

#-----

  • 기본적으로 top-down임. bottom-up으로 하고 싶다면,
os.walk(root_dir, topdown=False)

디렉토리만 순회

for root, dirs, files in os.walk(target):
    print(root)
  • root만으로도 쭉 디렉토리를 ./target 부터 쭉 순회한다.

path로 준 경로 지우고, walkroot + file 만 넣는 방법

출처: 링크


dir(os.path)

import os

print(dir(os.path))

--- 출력 ---
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', \
'__loader__', '__name__', '__package__', '__spec__', '_get_sep', \
'_joinrealpath', '_varprog', '_varprogb', 'abspath', 'altsep', \
'basename', 'commonpath', 'commonprefix', 'curdir', 'defpath', \
'devnull', 'dirname', 'exists', 'expanduser', 'expandvars', \
'extsep', 'genericpath', 'getatime', 'getctime', 'getmtime', \
'getsize', 'isabs', 'isdir', 'isfile', 'islink', 'ismount', \
'join', 'lexists', 'normcase', 'normpath', 'os', 'pardir', \
'pathsep', 'realpath', 'relpath', 'samefile', 'sameopenfile', \
'samestat', 'sep', 'split', 'splitdrive', 'splitext', 'stat', \
'supports_unicode_filenames', 'sys']
  • os.path어떤 기능 가지고 있니?

파일 만들때 에러 처리


환경변수

os.environ: 환경 변수 전체 (dict)

import os

print(os.environ.get('HOME')) : echo ${HOME}
  • dict.get을 이용해, Key가 없는 경우, None을 리턴함

os.getenv(): 특정 환경변수 값 얻기

  • 시스템의 환경변수 값을 알 수 있다. ($PATH, $ENV, $USER 등)
import os

print(os.getenv("PATH")) # ${PATH} value
print(os.getenv("HELLO")) # ${HELLO} 라는 환경 변수는 현재 없음 -> None

--- 출력 ----
내 환경의 PATH들
None
  • 설정한 환경변수 값이 없으면 None 반환

os.environ[]: 특정 환경변수 값 얻기

  • 시스템의 환경변수 값을 알 수 있다. (딕셔너리)
import os
WORKSPACE=os.environ['WORKSPACE'] # ${WORKSPACE} 를 받아서 python code에서 활용하게함
  • 없는 값이면 raise KeyError (key) from None Exception

환경변수 셋

import os
# 1. get existing environment
existing_path = os.getenv['PATH']
new_path = "hello:"+existing_path # "hello:$PATH"

# 2. set new path
os.environ['PATH']=new_path 	  # PATH=hello:$PATH

Goal: export $PATH="hello:$PATH" 작동하게 하는 python script

  • os.environ["variable"] = "value"을 활용
import sys

existing_path=os.getenv("PATH")	# 기존의 $PATH 값을 가져온다.

new_path="hello:"+existing_path	# hello:$PATH

os.environ["PATH"] = new_path	# export $PATH="hello:$PATH" 역할

print(os.getenv("PATH")) 	# 확인

os.path

os.path.join('A','B)

  • 'A'+'/'+'B' 로 문자열을 return 한다.
import os

path=os.path.join(str1,str2)

e.g.
  str1 = '/my/path'
  str2 = 'file'
  path = os.path.join(str1, str2)
  print(path)
  # === 출력 === #
  /my/path/file
  • 주의! os.path.join(A,'/B') 처럼 하면 원하지 않는 문자열 str이 return된다.
  • 예:
A = '/my/path'
B = '/include' # '/'가 prefix로 있으면 안됨!!
path = os.path.join(A,B)
# path = '/inlcude'

os.path.isdir(): directory인가?

import os

print( os.path.isdir( get.cwd() )
--- 출력 ---
True
  • os.path.isdir( arg ): arg로 주어진 문자열 경로가 디렉토리인가?
returndescription
True주어진 arg 경로는 디렉토리이다.
False주어진 arg 경로는 디렉토리가 아니다.

os.path.abspath(path): abs 경로 반환

  • os.path.abspath( path ):
    • 현재 경로 강제주입 + arg 로준 path => return


os.path.basename(path)


  • 현재 제일 뒤 경로만 두고 앞에는 싹 지움

os.path.dirname(path)

  • 경로의 제일 뒤 빼고 반환


os.path.commonprefix(list)

  • list로 input을 넣어 리스트 elements 사이 common prefix를 찾아 반환
    • 문자열 기반으로 prefix를 뽑는거라 신뢰하지 말것

os.path.exists(path) 존재?

  • 지정한 path파일, 디렉토리가 존재하는지 유(True)/무(False) 리턴


os.path.isfile(path)

os.path.isdir(path)

os.path.isabs()

os.path.isabs(path)¶
path가 절대 경로명이면 True를 반환합니다. 유닉스에서는 슬래시로 시작하고, 윈도우에서는 잠재적 드라이브 문자를 잘라낸 후 (역) 슬래시로 시작함을 의미합니다.

버전 3.6에서 변경: 경로류 객체를 받아들입니다.


os.path.normcase(path)

  • normcase로 OS에 맞게 디렉터리 층을 나눈다.

os.path.normpath(path)

  • normpath는 path를 정규화한다.

os.path.split(path)

  • path = dirname/basename으로 나눈다.

os.path.splitext(path)

os.path.splitext(path) -> Tuple
import os

PWD=os.getcwd()

print('%s%s%s' % ('\'',PWD,'\''))
print(os.path.splitext(PWD))
# === 출력 === #
'/home/pllpokko/workspace/python_exercise'
('/home/pllpokko/workspace/python_exercise', '')

os.path.realpath()

  • Return the canonical path of the specified filename, eliminating any symbolic links encountered in the path.

os.path.relpath(): 상대경로 구하기

  • 두 개의 parameter(a,b)가 들어가는데, b 기준으로 a상대경로를 구한다.
import os

LIBDIR = '/opt/sdk/2.19.0.g/sysroot/x86_64-sdk-linux/usr/lib'
BINDIR = '/opt/sdk/2.19.0.g/sysroot/x86_64-sdk-linux/usr/bin'

relpath = os.path.relpath(LIBDIR, BINDIR)
print(relpath)

# =========================== #
'../lib'
/usr/bin 기준에선, lib로 가려면, ../lib니까
os.path.relpath("/tmp/foo/bar", "/tmp")
foo/bar

os.path.relpath("/tmp/foo/bar", "/usr/bin")
../../tmp/foo/bar

glob

glob.glob(path)

  • ls와 유사한 기능을한다.
    • 정규식 사용 가능 (* ? [0-9])
  • (workspace) $ ls = glob.glob(os.getcwd()+'/*'))
  • list로 return


glob.iglob(path)

  • glob.glob와 다르게 iterator로 반환
    • list로 담지 않기 때문에 결과가 매우 많다면 유용함

profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글