파이썬에서 일반적인 배쉬 관용구를 구현하는 방법은 무엇입니까? [닫은]
나는 현재 잘 기억되지 않는 AWK, sed, Bash 및 작은 Perl을 통해 텍스트 파일 조작을하고 있습니다.
나는 파이썬이 이런 종류의 일에 좋다는 몇 곳을 언급했습니다. 파이썬을 사용하여 쉘 스크립팅, AWK, sed 및 친구들을 어떻게 대체 할 수 있습니까?
모든 쉘에는 몇 가지 기능 세트가 있습니다.
필수 Linux / Unix 명령 이들 모두는 서브 프로세스 라이브러리를 통해 사용 가능 합니다. 이것이 모든 외부 명령 을 수행하는 데 항상 최선의 선택은 아닙니다 . 또한 별도의 Linux 명령 인 일부 명령에 대해서는 shutil 을 참조하십시오. 그러나 Python 스크립트에서 직접 구현할 수도 있습니다. 또 다른 거대한 Linux 명령 배치는 os 라이브러리에 있습니다. 파이썬에서 더 간단하게 할 수 있습니다.
그리고-보너스! -- 더 빨리. 셸에서 각각의 개별 Linux 명령 (일부 예외 제외)은 하위 프로세스를 분기합니다. 파이썬
shutil
과os
모듈 을 사용 하면 하위 프로세스를 포크하지 않습니다.쉘 환경 기능. 여기에는 명령 환경을 설정하는 항목 (현재 디렉토리 및 환경 변수 및 기타)이 포함됩니다. 파이썬에서 직접 이것을 쉽게 관리 할 수 있습니다.
쉘 프로그래밍 기능. 이것은 모든 프로세스 상태 코드 검사, 다양한 논리 명령 (if, while, for 등)과 테스트 명령 및 모든 친척입니다. 함수 정의 물건. 이것은 파이썬에서 훨씬 훨씬 쉽습니다. 이것은 bash를 없애고 파이썬에서 그것을하는 데 큰 승리 중 하나입니다.
상호 작용 기능. 여기에는 명령 내역 및 기타 사항이 포함됩니다. 쉘 스크립트를 작성하기 위해 필요하지 않습니다. 이것은 스크립트 작성이 아니라 사람과의 상호 작용을위한 것입니다.
쉘 파일 관리 기능. 여기에는 리디렉션 및 파이프 라인이 포함됩니다. 더 까다 롭습니다. 이 중 많은 부분이 하위 프로세스로 수행 될 수 있습니다. 그러나 쉘에서 쉬운 것은 파이썬에서 불쾌합니다. 특히 같은 것들
(a | b; c ) | something >result
. 이렇게하면 두 개의 프로세스가 병렬로 실행a
되고 (에 대한 입력 으로 출력b
) 세 번째 프로세스가 이어집니다. 해당 시퀀스something
의 출력이 병렬로 실행되고 출력이라는 파일로 수집됩니다result
. 다른 언어로는 표현하기가 복잡합니다.
특정 프로그램 (awk, sed, grep 등)은 종종 파이썬 모듈로 재 작성 될 수 있습니다. 배 밖으로 가지 마십시오. 필요한 것을 교체하고 "grep"모듈을 발전 시키십시오. "grep"을 대체하는 Python 모듈 작성을 시작하지 마십시오.
가장 좋은 방법은 단계적으로 수행 할 수 있다는 것입니다.
- AWK 및 PERL을 Python으로 바꾸십시오. 다른 모든 것을 내버려 두십시오.
- GREP을 Python으로 바꾸는 것을보십시오. 이것은 좀 더 복잡 할 수 있지만 GREP 버전은 처리 요구 사항에 맞게 조정할 수 있습니다.
- FIND를 사용하는 Python 루프로 대체하는 것을보십시오
os.walk
. 많은 프로세스를 생성하지 않기 때문에 이것은 큰 승리입니다. - 일반적인 쉘 로직 (루프, 결정 등)을 파이썬 스크립트로 대체하는 것을보십시오.
예, 물론 :)
쉘 스크립트를 다시 작성하지 않는 데 도움이되는이 라이브러리를 살펴보십시오 (Plumbum의 좌우명).
당신이 AWK 교체 할 경우에도, 나오지도 뭔가 파이썬 그렙은 내가 추천을 기반으로 PYP을 -
"Pyed Piper"또는 pyp는 awk 또는 sed와 유사한 Linux 명령 행 텍스트 조작 도구이지만 표준 python 문자열 및 목록 방법과 강력한 사용자 정의 기능을 사용하여 강력한 프로덕션 환경에서 빠른 결과를 생성합니다.
방금 bash와 ipython의 가장 좋은 부분을 결합하는 방법을 발견했습니다. 지금까지 이것은 하위 프로세스 등을 사용하는 것보다 나에게 더 편안해 보입니다. 기존 bash 스크립트의 큰 부분을 쉽게 복사하고 python 방식으로 오류 처리를 추가 할 수 있습니다. :) 결과는 다음과 같습니다.
#!/usr/bin/env ipython3
# *** How to have the most comfort scripting experience of your life ***
# ######################################################################
#
# … by using ipython for scripting combined with subcommands from bash!
#
# 1. echo "#!/usr/bin/env ipython3" > scriptname.ipy # creates new ipy-file
#
# 2. chmod +x scriptname.ipy # make in executable
#
# 3. starting with line 2, write normal python or do some of
# the ! magic of ipython, so that you can use unix commands
# within python and even assign their output to a variable via
# var = !cmd1 | cmd2 | cmd3 # enjoy ;)
#
# 4. run via ./scriptname.ipy - if it fails with recognizing % and !
# but parses raw python fine, please check again for the .ipy suffix
# ugly example, please go and find more in the wild
files = !ls *.* | grep "y"
for file in files:
!echo $file | grep "p"
# sorry for this nonsense example ;)
에 IPython의 문서를 참조하십시오 시스템 쉘 명령을 하고 사용 하는 시스템 쉘로 .
2015 년 및 Python 3.4 릴리스부터는 http://xon.sh/ 또는 https://github.com/scopatz/xonsh 에서 합리적으로 완전한 사용자 대화 형 셸을 사용할 수 있습니다.
데모 비디오 파이프를 사용하고 있지만, 경우에 기본 쉘 모드가 지원됩니다 표시되지 않습니다.
Xonsh ( 'conch')는 bash를 모방하기 위해 매우 열심히 노력하므로 이미 근육 기억을 얻은 것들은 다음과 같습니다.
env | uniq | sort -r | grep PATH
또는
my-web-server 2>&1 | my-log-sorter
여전히 잘 작동합니다.
이 튜토리얼은 꽤 길며 일반적으로 재나 bash 프롬프트에서 기대할 수있는 많은 기능을 다루는 것 같습니다.
- 컴파일, 평가 및 실행!
- 명령 기록 및 탭 완성
- 와 도움말 및 Superhelp
?
&??
- 별명 및 사용자 정의 프롬프트
*.xsh
가져올 수있는 명령 및 / 또는 스크립트를 실행합니다- 조회를 포함한 환경 변수
${}
- 입력 / 출력 리디렉션 및 결합
- 백그라운드 작업 및 작업 제어
- 하위 프로세스, 파이프 및 코 프로세스 중첩
- 명령이 존재하면 서브 프로세스 모드, 그렇지 않으면 파이썬 모드
- 을 사용하여 캡처 된
$()
하위 프로세스,을 사용 하여 캡처되지 않은 하위 프로세스$[]
,@()
- 파일 이름 글 로빙
*
또는 정규식 파일 이름 글 로빙 및 백틱
- 파이썬을 쉘로 사용하려면 IPython을 보지 않겠습니까? 대화식으로 언어를 배우는 것도 좋습니다.
- 많은 텍스트 조작을 수행하고 Vim을 텍스트 편집기로 사용하는 경우 Vim 용 플러그인을 파이썬으로 직접 작성할 수도 있습니다. Vim에 ": help python"을 입력하고 지침을 따르거나이 프레젠테이션을 살펴보십시오 . 편집기에서 직접 사용할 함수를 작성하는 것은 매우 쉽고 강력합니다!
처음에는 sh, sed, awk (그리고 찾기, grep, ...)가있었습니다. 좋았습니다. 그러나 awk는 이상한 작은 짐승이 될 수 있으며 자주 사용하지 않으면 기억하기가 어렵습니다. 그런 다음 큰 낙타가 펄을 만들었습니다. Perl은 시스템 관리자의 꿈이었습니다. 스테로이드의 쉘 스크립팅과 같습니다. 정규 표현식을 포함한 텍스트 처리는 언어의 일부일뿐입니다. 사람들이 펄로 큰 응용 프로그램을 만들려고했습니다. 펄은 응용 프로그램이 될 수 있지만 실제로 조심하지 않으면 혼란스러워 보일 수 있습니다. 그리고이 모든 플랫 데이터 비즈니스가 있습니다. 프로그래머 너트를 운전하는 것으로 충분합니다.
Python, Ruby 등을 입력하십시오. 이것들은 정말 좋은 범용 언어입니다. 그들은 텍스트 처리를 지원하고 잘 수행합니다 (어쩌면 언어의 기본 핵심에 밀접하게 얽혀 있지는 않지만). 그러나 그들은 또한 확장 성이 뛰어나고, 하루가 끝날 때 여전히 멋진 코드를 가지고 있습니다. 그들은 또한 대부분의 것을위한 많은 도서관이있는 꽤 무거운 공동체를 개발했습니다.
이제 Perl에 대한 부정은 대부분 의견의 문제이며, 확실히 어떤 사람들은 매우 깨끗한 Perl을 작성할 수 있지만,이 많은 사람들이 난독 화 된 코드를 작성하기가 너무 쉽다고 불평하면서 진실의 일부가 있음을 알고 있습니다. 문제는 실제로 다음과 같습니다. 간단한 bash 스크립트 대체 이상 으로이 언어를 사용할 것입니까? 그렇지 않다면 더 많은 Perl을 배우십시오. 절대적으로 환상적입니다. 다른 한편으로, 당신이 더 많은 일을하고자 할 때 당신과 함께 성장할 언어를 원한다면, 파이썬이나 루비를 제안 할 수 있습니다.
어느 쪽이든, 행운을 빌어 요!
멋진 온라인 책 Dive Into Python을 제안합니다 . 내가 원래 언어를 배운 방법입니다.
언어의 기본 구조와 많은 유용한 데이터 구조를 가르치는 것 외에도 파일 처리 에 대한 장과 정규 표현식 등에 대한 장이 있습니다.
이전 답변에 추가 : 대화식 명령 (adduser, passwd 등)을 처리하기 위해 pexpect 모듈을 확인하십시오
내가 파이썬을 좋아하는 한 가지 이유는 POSIX 도구보다 훨씬 더 표준화되어 있기 때문입니다. 각 비트가 다른 운영 체제와 호환되는지 두 번 및 세 번 확인해야합니다. Linux 시스템에서 작성된 프로그램은 OSX의 BSD 시스템에서 동일하게 작동하지 않을 수 있습니다. Python을 사용하면 대상 시스템에 충분히 최신 버전의 Python이 있는지 확인해야합니다.
더 좋은 점은 표준 Python으로 작성된 프로그램이 Windows에서도 실행될 수 있다는 것입니다!
경험을 바탕으로 의견을 제시하겠습니다.
쉘의 경우 :
- 쉘은 읽기 전용 코드를 매우 쉽게 생성 할 수 있습니다. 그것을 쓰고 다시 돌아올 때, 당신은 다시 한 일을 알아낼 수 없을 것입니다. 이것을 달성하는 것은 매우 쉽습니다.
- 쉘은 파이프를 사용하여 한 줄에 많은 텍스트 처리, 분할 등을 수행 할 수 있습니다.
- 프로그램 호출을 다른 프로그래밍 언어로 통합 할 때 가장 좋은 접착제 언어입니다.
파이썬의 경우 :
- 윈도우로의 이식성을 원한다면 파이썬을 사용하십시오.
- python은 숫자 모음과 같은 텍스트 이상을 조작해야 할 때 더 좋습니다. 이를 위해 파이썬을 권장합니다.
나는 보통 대부분의 것들에 대해 bash를 선택하지만, 창 경계를 넘어야 할 것이 있으면 파이썬을 사용합니다.
pythonpy 는 awk 및 sed에서 많은 기능에 쉽게 액세스 할 수 있지만 python 구문을 사용하는 도구입니다.
$ echo me2 | py -x 're.sub("me", "you", x)'
you2
나는 세미 롱 쉘 스크립트 (300-500 줄)와 비슷한 기능을하는 Python 코드를 만들었습니다. 많은 외부 명령이 실행될 때 쉘이 사용하기 쉽다는 것을 알았습니다. 텍스트 조작이 많은 경우 Perl도 좋은 옵션입니다.
이 주제를 연구하는 동안이 개념 증명 코드 ( http://jlebar.com/2010/2/1/Replacing_Bash.html 의 주석을 통해 )를 통해 "파이썬에서 쉘 같은 파이프 라인을 작성할 수 있습니다. 간결한 구문 및 기존 시스템 도구를 활용하는 것이 좋습니다 ":
for line in sh("cat /tmp/junk2") | cut(d=',',f=1) | 'sort' | uniq:
sys.stdout.write(line)
최선의 방법은 문제를 해결하기위한 도구입니다. 텍스트 파일을 처리하는 경우 Sed, Awk 및 Perl이 최고의 경쟁자입니다. 파이썬은 범용 동적 언어입니다. 범용 언어와 마찬가지로 파일 조작에 대한 지원이 있지만 이것이 핵심 목적은 아닙니다. 특히 동적 언어가 필요한 경우 Python 또는 Ruby를 고려합니다.
간단히 말해서, Sed와 Awk를 정말 잘 배우고, * nix의 맛 (모든 배쉬 내장, grep, tr 등)과 함께 제공되는 다른 모든 장점을 배우십시오. 관심있는 텍스트 파일 처리라면 이미 올바른 것을 사용하고 있습니다.
ShellPy 라이브러리 에서 bash 대신 python을 사용할 수 있습니다 .
다음은 Github에서 Python 사용자의 아바타를 다운로드하는 예입니다.
import json
import os
import tempfile
# get the api answer with curl
answer = `curl https://api.github.com/users/python
# syntactic sugar for checking returncode of executed process for zero
if answer:
answer_json = json.loads(answer.stdout)
avatar_url = answer_json['avatar_url']
destination = os.path.join(tempfile.gettempdir(), 'python.png')
# execute curl once again, this time to get the image
result = `curl {avatar_url} > {destination}
if result:
# if there were no problems show the file
p`ls -l {destination}
else:
print('Failed to download avatar')
print('Avatar downloaded')
else:
print('Failed to access github api')
보다시피, 억음 악센트 (`) 기호 안의 모든 표현식은 쉘에서 실행됩니다. 그리고 파이썬 코드에서이 실행 결과를 캡처하고 이에 대한 작업을 수행 할 수 있습니다. 예를 들면 다음과 같습니다.
log = `git log --pretty=oneline --grep='Create'
이 줄은 먼저 git log --pretty=oneline --grep='Create'
셸에서 실행 된 다음 결과를 로그 변수에 할당합니다. 결과는 다음과 같은 속성을 갖습니다.
stdout 실행 된 프로세스의 stdout 에서 전체 텍스트
실행 된 프로세스의 stderr 에서 전체 텍스트를 stderr
실행의 리턴 코드
이것은 라이브러리에 대한 일반적인 개요이며, 예제가 포함 된 자세한 설명은 여기를 참조하십시오 .
텍스트 파일 조작이 일반적으로 일회성이고 쉘 프롬프트에서 수행되면 파이썬에서 더 나은 것을 얻지 못할 것입니다.
반면에 일반적으로 동일한 (또는 유사한) 작업을 반복해서 수행해야하며 스크립트를 작성 해야하는 경우 파이썬이 훌륭합니다. 자신의 라이브러리를 쉽게 만들 수 있습니다 (당신은 할 수 있습니다 쉘 스크립트도 있지만 더 성가시다).
느낌을 얻는 아주 간단한 예입니다.
import popen2
stdout_text, stdin_text=popen2.popen2("your-shell-command-here")
for line in stdout_text:
if line.startswith("#"):
pass
else
jobID=int(line.split(",")[0].split()[1].lstrip("<").rstrip(">"))
# do something with jobID
sys 및 getopt 모듈도 확인하십시오. 가장 먼저 필요한 모듈입니다.
PyPI에 패키지를 게시했습니다 : ez . 설치에
사용하십시오 pip install ez
.
쉘에 공통 명령을 압축했으며 멋지게 내 lib는 기본적으로 쉘과 동일한 구문을 사용합니다. 예를 들어, cp (source, destination)는 파일과 폴더를 모두 처리 할 수 있습니다! (shutil.copy의 래퍼 shutil.copytree와 어느 것을 사용할지 결정합니다). 훨씬 더 멋지게 R과 같은 벡터화를 지원할 수 있습니다!
또 다른 예 : os.walk 없음, fls (path, regex)를 사용하여 파일을 재귀 적으로 찾고 정규식으로 필터링하면 전체 경로가 있거나없는 파일 목록을 반환합니다
마지막 예 : 그것들을 결합하여 매우 간단한 스크립트를 작성할 수 있습니다.
files = fls('.','py$'); cp(files, myDir)
확실히 확인하십시오! 쓰거나 개선하는데 수백 시간이 걸렸습니다!
참고 URL : https://stackoverflow.com/questions/209470/how-to-implement-common-bash-idioms-in-python
'Programing' 카테고리의 다른 글
Get. 대신 POST로 리디렉션? (0) | 2020.04.09 |
---|---|
열거 형 명명 규칙-복수 (0) | 2020.04.09 |
Message Queue와 웹 서비스? (0) | 2020.04.09 |
필요한 속성을 적용 할 수 있습니까 (0) | 2020.04.09 |
고정 / 고정 된 왼쪽 열과 스크롤 가능한 본문이있는 HTML 테이블을 어떻게 만듭니 까? (0) | 2020.04.09 |