본문 바로가기

About/Python

[Python] IPython을 사용한 Unix/Linux 셸 명령어 실행 - (IPython.utils.SList에 대하여)

https://ipython.org/

 

Jupyter and the future of IPython — IPython

IPython provides a rich architecture for interactive computing with: A powerful interactive shell. A kernel for Jupyter. Support for interactive data visualization and use of GUI toolkits. Flexible, embeddable interpreters to load into your own projects. E

ipython.org

IPython 설치는 설치 프로그램에 따라 다음과 같이 설치합니다.

brew install ipython

conda update conda
conda update ipython

pip install ipython[all]
pip3 install ipython[all]
cs

 


IPython

iPython은 파이썬의 기본 대화형 쉘의 기능을 향상 시킨 도구입니다. 단순한 편의 기능이 몇 가지 추가된 수준이 아니라 최적화, 디버깅, 코드 편집과 탐색에 있어서 많은 양의 개선된 기능들을 포함하고 있습니다.

IPython을 이용하면 셸 명령어를 실행할 수 있는데, 이는 IPython 셸에서 데브옵스 작업을 수행하는 가장 큰 이유입니다. IPython이 셸 명령어를 구분하기 위해  '!' 문자를 명령어 앞에 사용합니다.

# 예시
In [1]: var_ls = !ls -l
 
In [2]: type(var_ls)
Out[2]: IPython.utils.text.SList
 
In [3]: var_ls
Out[3]:
['total 0',
 'drwxr-xr-x@ 8 kimjihwan  staff  256  1 13 23:14 GIT',
 'drwxr-xr-x  6 kimjihwan  staff  192 12 29 13:23 Source Code',
 'drwxr-xr-x@ 7 kimjihwan  staff  224  9 27 22:10 md',
 'drwxr-xr-x  6 kimjihwan  staff  192  1 21 04:05 문서']
cs

위에서 명령어의 출력은 파이썬 변수 var_ls 에 할당되며 이 변수의 type은 IPython.utils.text.SList 입니다.

IPython.utils.SList

SList 타입은 일반 셸 명령을 3개의 메인 메서드 fields, grep, sort를 갖는 객체로 변환합니다. 일반 리스트 객체와 유사하지만 다음과 같은 속성도 가집니다.

  • .l (or .list) : value as list (the list itself).
  • .n (or .nlstr): value as a string, joined on newlines. (줄바꿈을 기준으로  합친 str 자료형으로 반환)
  • .s (or .spstr): value as a string, joined on spaces.(공백을 기준으로  합친 str 자료형으로 반환)
  • .p (or .paths): list of path objects (requires path.py package)

예시

In [51]: var_ls.l
Out[51]:
['total 0',
 'drwxr-xr-x@ 8 kimjihwan  staff  256  1 13 22:14 GIT',
 'drwxr-xr-x  6 kimjihwan  staff  192 12 29 13:23 Source Code',
 'drwxr-xr-x@ 7 kimjihwan  staff  224  9 27 22:10 md',
 'drwxr-xr-x  6 kimjihwan  staff  192  1 21 04:05 문서']
 
In [52]: var_ls.n
Out[52]: 'total 0\ndrwxr-xr-x@ 8 kimjihwan  staff  256  1 13 23:14 GIT\ndrwxr-xr-x  6 kimjihwan  staff  192 12 29 13:23 Source Code\ndrwxr-xr-x@ 7 kimjihwan  staff  224  9 27 22:10 md\ndrwxr-xr-x  6 kimjihwan  staff  192  1 21 04:05 문서'
 
In [53]: var_ls.s
Out[53]: 'total 0 drwxr-xr-x@ 8 kimjihwan  staff  256  1 13 23:14 GIT drwxr-xr-x  6 kimjihwan  staff  192 12 29 13:23 Source Code drwxr-xr-x@ 7 kimjihwan  staff  224  9 27 22:10 md drwxr-xr-x  6 kimjihwan  staff  192  1 21 04:05 문서'
 
In [54]: var_ls.p
Out[54]: []
cs

 

fileds(*fileld)

Slist에서 공백으로 필드를 구분하고, 필드 번호를 매겨서 원하는 필드만 가져옵니다. 예를들어 !ls -ld의 결과가 다음과 같을 때 feilds()를 이용하여 다음과 같이 사용할 수 있습니다.

In [8]: var_ls = !ls -l
 
In [9]: var_ls
Out[9]:
['total 0',
 'drwxr-xr-x@ 8 kimjihwan  staff  256  1 13 23:14 GIT',
 'drwxr-xr-x  6 kimjihwan  staff  192 12 29 13:23 Source Code',
 'drwxr-xr-x@ 7 kimjihwan  staff  224  9 27 22:10 md',
 'drwxr-xr-x  6 kimjihwan  staff  192  1 21 04:05 문서']
 
In [10]: var_ls.fields(0)
Out[10]: ['total''drwxr-xr-x@''drwxr-xr-x''drwxr-xr-x@''drwxr-xr-x']
 
In [11]: var_ls.fields(10)
Out[11]: ['0 total''8 drwxr-xr-x@''6 drwxr-xr-x''7 drwxr-xr-x@''6 drwxr-xr-x']
 
In [12]: var_ls.fields(-1)
Out[12]: ['0''GIT''Code''md''문서']
cs

결과 값을 0부터 index를 매기고 해당 index로 원하는 필드(열)만 가져올 수 있습니다. -1은 파이썬 문법과 동일하게 가장 마지막 index를 의미합니다.

grep(pattern, prune=False, field=None)

Slist에서 패턴과 일치하는 모든 문자열을 반환합니다.  prune=True 인 경우 패턴과 일치하지 않는 모든 항목을 반환합니다. feild 파라미터에 원하는 필드에서만 패턴을 찾도록 지정할 수 도 있으며 pattern 파라미터에 python의 lambda 함수 또한 사용할 수 있습니다.

In [40]: var_ls
Out[40]:
['total 0',
 'drwxr-xr-x@ 8 kimjihwan  staff  256  1 13 23:14 GIT',
 'drwxr-xr-x  6 kimjihwan  staff  192 12 29 13:23 Source Code',
 'drwxr-xr-x@ 7 kimjihwan  staff  224  9 27 22:10 md',
 'drwxr-xr-x  6 kimjihwan  staff  192  1 21 04:05 문서']
 
In [41]: var_ls.grep(lambda x: x.startswith("drwxr-xr-x@"))
Out[41]:
['drwxr-xr-x@ 8 kimjihwan  staff  256  1 13 23:14 GIT',
 'drwxr-xr-x@ 7 kimjihwan  staff  224  9 27 22:10 md']
 
In [42]: var_ls.grep(lambda x: x.startswith("drwxr-xr-x@"), prune=True)
Out[42]:
['total 0',
 'drwxr-xr-x  6 kimjihwan  staff  192 12 29 13:23 Source Code',
 'drwxr-xr-x  6 kimjihwan  staff  192  1 21 04:05 문서']
 
In [43]: var_ls.grep("md", field=-1)
Out[43]: ['drwxr-xr-x@ 7 kimjihwan  staff  224  9 27 22:10 md']
cs

sort(field=Nonenums=False)

SList를 특정 필드를 기준으로 정렬합니다. 필드가 숫자인 경우 nums=True 로 지정합니다. 기본 오름차순으로 정렬됩니다.

In [46]: var_ls
Out[46]:
['total 0',
 'drwxr-xr-x@ 8 kimjihwan  staff  256  1 13 23:14 GIT',
 'drwxr-xr-x  6 kimjihwan  staff  192 12 29 13:23 Source Code',
 'drwxr-xr-x@ 7 kimjihwan  staff  224  9 27 22:10 md',
 'drwxr-xr-x  6 kimjihwan  staff  192  1 21 04:05 문서']
 
In [47]: var_ls.sort(field=1, nums=True)
Out[47]:
['total 0',
 'drwxr-xr-x  6 kimjihwan  staff  192  1 21 04:05 문서',
 'drwxr-xr-x  6 kimjihwan  staff  192 12 29 13:23 Source Code',
 'drwxr-xr-x@ 7 kimjihwan  staff  224  9 27 22:10 md',
 'drwxr-xr-x@ 8 kimjihwan  staff  256  1 13 23:14 GIT']
cs
 

사용 예시

다음은 유닉스의 df 명령어를 사용한 예시 입니다.

다음의 sort 메서드는 이 유닉스 명령을 해석해서 세 번째 열을 크기 기준으로 정렬합니다.

In [6]: var_df = !df
 
In [7]: var_df
Out[7]:
['Filesystem                                  512-blocks      Used Available Capacity iused      ifree %iused  Mounted on',
 '/dev/disk3s1s1                               478724992  43596624 191563792    19%  553781 2393071179    0%   /',
 'devfs                                              405       405         0   100%     702          0  100%   /dev',
 '/dev/disk3s6                                 478724992        40 191563792     1%       0 2393624960    0%   /System/Volumes/VM',
 '/dev/disk3s2                                 478724992    639240 191563792     1%     234 2393624726    0%   /System/Volumes/Preboot',
 '/dev/disk3s4                                 478724992   1173920 191563792     1%     188 2393624772    0%   /System/Volumes/Update',
 '/dev/disk1s2                                   1024000     12328    986208     2%       3    5119997    0%   /System/Volumes/xarts',
 '/dev/disk1s1                                   1024000     15120    986208     2%      18    5119982    0%   /System/Volumes/iSCPreboot',
 '/dev/disk1s3                                   1024000       624    986208     1%      29    5119971    0%   /System/Volumes/Hardware',
 '/dev/disk3s5                                 478724992 237890808 191563792    56% 1102447 2392522513    0%   /System/Volumes/Data',
 'map auto_home                                        0         0         0   100%       0          0  100%   /System/Volumes/Data/home',
 '/dev/disk3s1                                 478724992  43596624 191563792    19%  553788 2393071172    0%   /System/Volumes/Update/mnt1',
 '/Users/kimjihwan/Downloads/Sublime Text.app  478724992 237869288 191585312    56% 1102440 2392522520    0%   /private/var/folders/4p/hh2dnp410s7f099rrpwn8s0c0000gn/T/AppTranslocation/E342E303-FD92-41EE-8EF8-26F5AB985373']
 
In [8]: var_df.sort(3, nums=True)
Out[8]:
['Filesystem                                  512-blocks      Used Available Capacity iused      ifree %iused  Mounted on',
 'devfs                                              405       405         0   100%     702          0  100%   /dev',
 'map auto_home                                        0         0         0   100%       0          0  100%   /System/Volumes/Data/home',
 '/dev/disk1s1                                   1024000     15120    986208     2%      18    5119982    0%   /System/Volumes/iSCPreboot',
 '/dev/disk1s2                                   1024000     12328    986208     2%       3    5119997    0%   /System/Volumes/xarts',
 '/dev/disk1s3                                   1024000       624    986208     1%      29    5119971    0%   /System/Volumes/Hardware',
 '/dev/disk3s1                                 478724992  43596624 191563792    19%  553788 2393071172    0%   /System/Volumes/Update/mnt1',
 '/dev/disk3s1s1                               478724992  43596624 191563792    19%  553781 2393071179    0%   /',
 '/dev/disk3s2                                 478724992    639240 191563792     1%     234 2393624726    0%   /System/Volumes/Preboot',
 '/dev/disk3s4                                 478724992   1173920 191563792     1%     188 2393624772    0%   /System/Volumes/Update',
 '/dev/disk3s5                                 478724992 237890808 191563792    56% 1102447 2392522513    0%   /System/Volumes/Data',
 '/dev/disk3s6                                 478724992        40 191563792     1%       0 2393624960    0%   /System/Volumes/VM',
 '/Users/kimjihwan/Downloads/Sublime Text.app  478724992 237869288 191585312    56% 1102440 2392522520    0%   /private/var/folders/4p/hh2dnp410s7f099rrpwn8s0c0000gn/T/AppTranslocation/E342E303-FD92-41EE-8EF8-26F5AB985373']
cs

결과를 살펴보면 var_df 변수에 df 명령어의 결과가 저장되었고, var_df.sort(3, nums=True)var_df에 저장된 결과를 3번째 열(Available)을 기준으로 정렬하여 출력합니다. 

다음과 sortfield 명령어를 같이 사용해서 dfFileSystem, Available,Capacity 필드만 가져오는 예시 입니다.

In [19]: sorted_var_df = var_df.sort(3, nums=True)
In [20]: sorted_var_dfs
Out[20]:
['Filesystem                                  512-blocks      Used Available Capacity iused      ifree %iused  Mounted on',
 'devfs                                              405       405         0   100%     702          0  100%   /dev',
 'map auto_home                                        0         0         0   100%       0          0  100%   /System/Volumes/Data/home',
 '/dev/disk1s1                                   1024000     15120    986208     2%      18    5119982    0%   /System/Volumes/iSCPreboot',
 '/dev/disk1s2                                   1024000     12328    986208     2%       3    5119997    0%   /System/Volumes/xarts',
 '/dev/disk1s3                                   1024000       624    986208     1%      29    5119971    0%   /System/Volumes/Hardware',
 '/dev/disk3s1                                 478724992  43596624 191563792    19%  553788 2393071172    0%   /System/Volumes/Update/mnt1',
 '/dev/disk3s1s1                               478724992  43596624 191563792    19%  553781 2393071179    0%   /',
 '/dev/disk3s2                                 478724992    639240 191563792     1%     234 2393624726    0%   /System/Volumes/Preboot',
 '/dev/disk3s4                                 478724992   1173920 191563792     1%     188 2393624772    0%   /System/Volumes/Update',
 '/dev/disk3s5                                 478724992 237890808 191563792    56% 1102447 2392522513    0%   /System/Volumes/Data',
 '/dev/disk3s6                                 478724992        40 191563792     1%       0 2393624960    0%   /System/Volumes/VM',
 '/Users/kimjihwan/Downloads/Sublime Text.app  478724992 237869288 191585312    56% 1102440 2392522520    0%   /private/var/folders/4p/hh2dnp410s7f099rrpwn8s0c0000gn/T/AppTranslocation/E342E303-FD92-41EE-8EF8-26F5AB985373']
 
In [21]: sorted_var_df.fields(034)
Out[21]:
['Filesystem Available Capacity',
 'devfs 0 100%',
 'map 0 0',
 '/dev/disk1s1 986208 2%',
 '/dev/disk1s2 986208 2%',
 '/dev/disk1s3 986208 1%',
 '/dev/disk3s1 191563792 19%',
 '/dev/disk3s1s1 191563792 19%',
 '/dev/disk3s2 191563792 1%',
 '/dev/disk3s4 191563792 1%',
 '/dev/disk3s5 191563792 56%',
 '/dev/disk3s6 191563792 1%',
 '/Users/kimjihwan/Downloads/Sublime 237869288 191585312']
 
cs

위의 예시는 var_df를 3번째 열을 기준으로 정렬한 sorted_var_df에 저장합니다. 그리고 sorted_var_df.fields(0, 3, 4)는 sorted_var_df의 결과에서 0, 3, 4번째 필드만 가져옵니다. 

마지막으로 Slist의 grep을 사용한 예시입니다. /usr/bin에 설치된 명령 파일중 이름에 kill이 포함된 파일을 찾는 예시 입니다.

In [56]: var_ls_bin = !ls -/usr/bin
 
In [57]: var_ls_bin.grep("kill")
Out[57]:
['-rwxr-xr-x  1 root   wheel      1621  1  1  2020 kill.d',
 '-rwxr-xr-x  1 root   wheel    122272  1  1  2020 killall',
 '-rwxr-xr-x  1 root   wheel    141136  1  1  2020 pkill']
cs

IPython을 이용한 리눅스/유닉스 쉘 스크립트 사용 방법에 대하여 알아보았습니다.

참고

https://ipython.readthedocs.io/en/stable/api/generated/IPython.utils.text.html

 

Module: utils.text — IPython 8.0.1 documentation

Important This documentation covers IPython versions 6.0 and higher. Beginning with version 6.0, IPython stopped supporting compatibility with Python versions lower than 3.3 including all versions of Python 2.7. If you are looking for an IPython version co

ipython.readthedocs.io

https://ipython.org/

 

Jupyter and the future of IPython — IPython

IPython provides a rich architecture for interactive computing with: A powerful interactive shell. A kernel for Jupyter. Support for interactive data visualization and use of GUI toolkits. Flexible, embeddable interpreters to load into your own projects. E

ipython.org