파이썬에서 일반적인 bash 관용구를 구현하는 방법은 무엇입니까? [닫은]


242

나는 현재 잘 기억되지 않는 AWK, sed, Bash 및 작은 Perl을 통해 텍스트 파일 조작을하고 있습니다.

나는 파이썬이 이런 종류의 일에 좋다는 몇 곳을 언급했습니다. 파이썬을 사용하여 쉘 스크립팅, AWK, sed 및 친구들을 어떻게 대체 할 수 있습니까?


3
pythonpy는 AWK를위한 좋은 경쟁자와 파이썬 구문을 사용 나오지 : github.com/Russell91/pythonpy
RussellStewart

4
당신은 대체 염두에두고 아이디어로 디자인되었다 shellpy을 사용할 수 있습니다 bash는 / 쉬와 파이썬 github.com/lamerman/shellpy
알렉산더 Ponomarev 보낸

이것은 내 질문이며, 그것이 의견에 근거한 이유를 이해하지 못합니다. 맨 위의 답변은 쉘이 수행하는 각각의 주요 작업을 나열하고 파이썬에서 어떻게 수행하는지 알려줍니다. 내 의견으로는 비 의견 방식으로 질문에 대답합니다.
Chris Jefferson

이 질문과 그
Erik A

답변:


144

모든 쉘에는 몇 가지 기능 세트가 있습니다.

  • 필수 Linux / Unix 명령 이들 모두는 서브 프로세스 라이브러리를 통해 사용 가능 합니다. 이것이 모든 외부 명령 을 수행하는 데 항상 최선의 선택은 아닙니다 . 또한 별도의 Linux 명령 인 일부 명령에 대해서는 shutil 을 참조하십시오. 그러나 Python 스크립트에서 직접 구현할 수도 있습니다. 또 다른 거대한 Linux 명령 배치는 os 라이브러리에 있습니다. 파이썬에서 더 간단하게 할 수 있습니다.

    그리고-보너스! -- 더 빠르게. 셸에서 각각의 개별 Linux 명령 (일부 예외 제외)은 하위 프로세스를 분기합니다. 파이썬 shutilos모듈 을 사용 하면 하위 프로세스를 포크하지 않습니다.

  • 쉘 환경 기능. 여기에는 명령 환경을 설정하는 항목 (현재 디렉토리 및 환경 변수 및 기타)이 포함됩니다. 파이썬에서 직접 이것을 쉽게 관리 할 수 ​​있습니다.

  • 쉘 프로그래밍 기능. 이것은 모든 프로세스 상태 코드 검사, 다양한 논리 명령 (if, while, for 등)과 테스트 명령 및 모든 친척입니다. 함수 정의 물건. 이것은 파이썬에서 훨씬 훨씬 쉽습니다. 이것은 bash를 없애고 파이썬에서 그것을하는 데 큰 승리 중 하나입니다.

  • 상호 작용 기능. 여기에는 명령 내역 및 기타 사항이 포함됩니다. 쉘 스크립트를 작성하는 데 필요하지 않습니다. 이것은 스크립트 작성이 아니라 사람과의 상호 작용을위한 것입니다.

  • 쉘 파일 관리 기능. 여기에는 리디렉션 및 파이프 라인이 포함됩니다. 더 까다 롭습니다. 이 중 많은 부분이 하위 프로세스로 수행 될 수 있습니다. 그러나 쉘에서는 쉬운 것들이 파이썬에서는 불쾌합니다. 특히 같은 것들 (a | b; c ) | something >result. 이렇게하면 두 개의 프로세스가 병렬로 실행 a되고 (입력 이 출력 됨 b) 세 번째 프로세스가 이어집니다. 해당 시퀀스 something의 출력이 병렬로 실행되고 출력이라는 파일로 수집됩니다 result. 다른 언어로는 표현하기가 복잡합니다.

특정 프로그램 (awk, sed, grep 등)은 종종 파이썬 모듈로 재 작성 될 수 있습니다. 배 밖으로 가지 마십시오. 필요한 것을 교체하고 "grep"모듈을 발전 시키십시오. "grep"을 대체하는 Python 모듈 작성을 시작하지 마십시오.

가장 좋은 방법은 단계적으로 수행 할 수 있다는 것입니다.

  1. AWK 및 PERL을 Python으로 바꾸십시오. 다른 모든 것을 내버려 두십시오.
  2. GREP을 Python으로 바꾸는 것을보십시오. 좀 더 복잡 할 수 있지만 GREP 버전은 처리 요구에 맞게 조정할 수 있습니다.
  3. FIND를 사용하는 Python 루프로 바꾸는 것을보십시오 os.walk. 많은 프로세스를 생성하지 않기 때문에 이것은 큰 승리입니다.
  4. 일반적인 쉘 로직 (루프, 결정 등)을 파이썬 스크립트로 대체하는 것을보십시오.

6
"상호 작용 기능. 여기에는 명령 기록 및 기타 정보가 포함됩니다. 필요하지 않습니다." 아무도 사람이 실제로 필요한 것을 말할 수 없을 것입니다. 아마 그는 할 것입니다. 또한 이러한 기능은 대화 형 셸에서 상당히 의미가 있으며 유휴와 IPython의 차이점을 예로 들어 설명합니다.
heltonbiker

47
나는 사람들이 쉘 스크립팅을 완전히 버릴 것을 진심으로 바란다. 나는 해킹이 * nix 세계에서 실제로 종교라는 것을 이해하지만 OS에 이식 된 모든 해킹 해결 방법을 해석하려고 노력하는 데 정말로 지쳤습니다. 마이크로 툴 (awk, sed, top, base 등)의 참신함은 모두가 자신의 버전을 출시하기로 결정한 날부터 시작되었습니다. 몇 가지 잘 설계된 Python 모듈로 쉽게 대체 할 수있는 엉터리 작은 도구에 낭비되는 인력 시간을 상상할 때 울었습니다. :: sigh ::
Evan Plaice

40
내가 find가지고있는 여러 스크립트 의 파이썬 버전 이 추악하고 길고 비교할 수 없기 때문에 @EvanPlaice에 동의하지 않습니다 . 많은 일을 해야 쉘 스크립트를, 많은 사람들이 . 모든 것이 Python 또는 BASH (또는 다른 것) 중 하나 일 필요는 없습니다.
mikebabcock 4

8
@mikebabcock 이상적으로는 기본 * nix 스택으로 제공되는 모든 마이크로 도구를 구현하는 완벽한 라이브러리가 있습니다. find () 및 last ()와 같은 함수가 포함되며 파이프 대신 카레와 게으른 로딩의 조합으로 모든 것을 붙일 수 있습니다. 모든 배포판에서 표준 방식으로 작동하는 POSIX 스크립팅 환경을 갖는 것이 좋지 않습니까? 아직 그런 것은 존재하지 않습니다 ...
Evan Plaice

2
쉘 파이프 라인 (예 (a | b; c ) | something >resultsubprocessshell=True
:)

103

예, 물론 :)

쉘 스크립트를 다시 작성하지 않는 데 도움이되는이 라이브러리를 살펴보십시오 (Plumbum의 좌우명).

당신이 AWK 교체 할 경우에도, 나오지도 뭔가 파이썬 그렙은 내가 추천을 기반으로 PYP을 -

"Pyed Piper"또는 pyp는 awk 또는 sed와 유사한 Linux 명령 행 텍스트 조작 도구이지만 표준 python 문자열 및 목록 방법과 강력한 사용자 정의 기능을 사용하여 강력한 프로덕션 환경에서 빠른 결과를 생성합니다.


또한 쉬의 대안입니다 특사 봐,이 github.com/kennethreitz/envoy
AllanLRH

57

방금 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의 문서를 참조하십시오 시스템 쉘 명령을 하고 사용 하는 시스템 쉘로 .


11
기괴한 이유 때문에 IPython에서! -commands를 언급 한 사람은 아무도 없었습니다. 특히 filelines = ! cat myfile
kampu

그리고 $var쉘 명령에서 와 같이 파이썬 변수를 사용할 수 있습니까? 와. 이것이 정답입니다.
Chiel ten Brinke

그리고 Jupyter 노트북 내에서도 사용할 수 있습니다
Yuval Atzmon

44

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가져올 수있는 명령 및 / 또는 스크립트를 실행합니다
  • 조회를 포함한 환경 변수 ${}
  • 입력 / 출력 리디렉션 및 결합
  • 백그라운드 작업 및 작업 제어
  • 하위 프로세스, 파이프 및 코 프로세스 중첩
  • 명령이 존재하면 서브 프로세스 모드, 그렇지 않으면 파이썬 모드
  • 을 사용하여 캡처 된 $()하위 프로세스,을 사용 하여 캡처되지 않은 하위 프로세스 $[],@()
  • 파일 이름 글 로빙 *또는 정규식 파일 이름 글 로빙 및 백틱

그러나 왜이 모든 대답이 배쉬를 모르는 사람들을 위해 바퀴 재발 명하는 것처럼 보 입니까? 나는 bash에 적당히 익숙해졌으며 이러한 대답은 모두 약간의 이익을 위해 더 많은 일을하는 것처럼 보입니다. 이 답변은 모두 bash를 두려워하는 (또는 배우는 데 시간을 보내고 싶지 않은) 파이썬 사람들을 겨냥한 것입니다.
Buttle Butkus

그것은 사용에 대한 요구 사항과 같은 몇 가지 단점이 보인다 .xsh다음 xonsh 코드 파일의 확장자 github.com/xonsh/xonsh/issues/2478을 . 그렇지 않으면 파일 evalx에서 직접 호출하는 데 사용해야 .py합니다.
Andry

31
  • 파이썬을 쉘로 사용하려면 IPython을 보지 않겠습니까? 대화식으로 언어를 배우는 것도 좋습니다.
  • 많은 텍스트 조작을 수행하고 Vim을 텍스트 편집기로 사용하는 경우 Vim 용 플러그인을 파이썬으로 직접 작성할 수도 있습니다. Vim에 ": help python"을 입력하고 지시를 따르거나이 프리젠 테이션을 살펴보십시오 . 편집기에서 직접 사용할 함수를 작성하는 것은 매우 쉽고 강력합니다!

8
'sh'라는 ipython 프로파일이있어 인터프리터를 쉘과 매우 유사 하게 만듭니다 .
Autoplectic

3
ipython 'sh'프로파일이 한동안 제거되었습니다.
gdw2

>>> 결과 =! dmesg | grep -i 'usb'#the! 운영자는 모든 것을
Permafacture

16

처음에는 sh, sed, awk (그리고 찾기, grep, ...)가있었습니다. 좋았습니다. 그러나 awk는 이상한 작은 짐승이 될 수 있으며 자주 사용하지 않으면 기억하기가 어렵습니다. 그런 다음 큰 낙타가 펄을 만들었습니다. Perl은 시스템 관리자의 꿈이었습니다. 스테로이드의 쉘 스크립팅과 같습니다. 정규 표현식을 포함한 텍스트 처리는 언어의 일부일뿐입니다. 사람들이 펄로 큰 응용 프로그램을 만들려고했습니다. 펄은 응용 프로그램이 될 수 있지만 실제로 조심하지 않으면 혼란스러워 보일 수 있습니다. 그리고이 모든 플랫 데이터 비즈니스가 있습니다. 프로그래머 너트를 운전하는 것으로 충분합니다.

Python, Ruby 등을 입력하십시오. 이것들은 정말 좋은 범용 언어입니다. 그들은 텍스트 처리를 지원하고 잘 수행합니다 (어쩌면 언어의 기본 핵심에 밀접하게 얽혀 있지는 않지만). 그러나 그들은 또한 확장 성이 뛰어나고, 하루가 끝날 때 여전히 멋진 코드를 가지고 있습니다. 그들은 또한 대부분의 것을위한 많은 도서관이있는 꽤 무거운 공동체를 개발했습니다.

이제 Perl에 대한 부정은 대부분 의견의 문제이며, 확실히 어떤 사람들은 매우 깨끗한 Perl을 작성할 수 있지만,이 많은 사람들이 난독 화 된 코드를 작성하기가 너무 쉽다고 불평하면서 진실의 일부가 있다는 것을 알고 있습니다. 문제는 실제로 다음과 같습니다. 간단한 bash 스크립트 대체 이상 으로이 언어를 사용할 것입니까? 그렇지 않다면 더 많은 Perl을 배우십시오. 그것은 절대적으로 환상적입니다. 다른 한편으로, 당신이 더 많은 일을하고자 할 때 당신과 함께 성장할 언어를 원한다면, 파이썬이나 루비를 제안 할 수 있습니다.

어느 쪽이든, 행운을 빌어 요!




7

내가 파이썬을 좋아하는 한 가지 이유는 POSIX 도구보다 훨씬 표준화되어 있기 때문입니다. 각 비트가 다른 운영 체제와 호환되는지 두 번 및 세 번 확인해야합니다. Linux 시스템에서 작성된 프로그램은 OSX의 BSD 시스템에서 동일하게 작동하지 않을 수 있습니다. Python을 사용하면 대상 시스템에 충분히 최신 버전의 Python이 있는지 확인해야합니다.

더 좋은 점은 표준 Python으로 작성된 프로그램이 Windows에서도 실행될 수 있다는 것입니다!


1
"표준 파이썬으로 작성된 프로그램은 심지어 Windows에서도 실행됩니다": 농담이 아닙니까?
Jean-François Fabre

6

경험을 바탕으로 의견을 제시하겠습니다.

쉘의 경우 :

  • 쉘은 읽기 전용 코드를 매우 쉽게 생성 할 수 있습니다. 그것을 작성하고 다시 올 때, 당신은 다시 한 일을 알아낼 수 없을 것입니다. 이것을 달성하는 것은 매우 쉽습니다.
  • 쉘은 파이프를 사용하여 한 줄에 많은 텍스트 처리, 분할 등을 수행 할 수 있습니다.
  • 프로그램 호출을 다른 프로그래밍 언어로 통합 할 때 가장 좋은 접착제 언어입니다.

파이썬의 경우 :

  • 윈도우로의 이식성을 원한다면 파이썬을 사용하십시오.
  • 파이썬은 숫자 모음과 같이 텍스트 이상을 조작해야 할 때 더 좋습니다. 이를 위해 파이썬을 권장합니다.

나는 보통 대부분의 것들에 대해 bash를 선택하지만, 창 경계를 넘어야 할 것이 있으면 파이썬을 사용합니다.


4

pythonpy 는 awk 및 sed에서 많은 기능에 쉽게 액세스 할 수 있지만 python 구문을 사용하는 도구입니다.

$ echo me2 | py -x 're.sub("me", "you", x)'
you2

3

나는 세미 롱 쉘 스크립트 (300-500 줄)와 비슷한 기능을하는 Python 코드를 만들었습니다. 많은 외부 명령이 실행될 때 쉘을 사용하는 것이 더 쉽다는 것을 알았습니다. 텍스트 조작이 많은 경우 Perl도 좋은 옵션입니다.



2

최선의 방법은 문제를 해결하기위한 도구입니다. 텍스트 파일을 처리하는 경우 Sed, Awk 및 Perl이 최고의 경쟁자입니다. 파이썬은 범용 동적 언어입니다. 범용 언어와 마찬가지로 파일 조작을 지원하지만 이것이 핵심 목적이 아닙니다. 특히 동적 언어가 필요한 경우 Python 또는 Ruby를 고려합니다.

간단히 말해서, Sed와 Awk를 정말 잘 배우고, * nix의 맛 (모든 배쉬 내장, grep, tr 등)과 함께 제공되는 다른 모든 장점을 배우십시오. 관심있는 텍스트 파일 처리라면 이미 올바른 것을 사용하고 있습니다.


2

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

실행의 리턴 코드

이것은 라이브러리에 대한 일반적인 개요이며, 예제가 포함 된 자세한 설명은 여기를 참조하십시오 .


1

텍스트 파일 조작이 일반적으로 한 번이고 쉘 프롬프트에서 수행되면 파이썬에서 더 나은 것을 얻지 못할 것입니다.

다른 한편으로, 당신이 일반적으로 같은 (또는 유사한) 작업을 반복해서 수행해야하고 그것을하기위한 스크립트를 작성해야한다면, 파이썬은 훌륭합니다-쉽게 자신의 라이브러리를 만들 수 있습니다 (당신은 할 수 있습니다 쉘 스크립트도 있지만 더 성가시다).

느낌을 얻는 아주 간단한 예입니다.

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 모듈도 확인하십시오. 가장 먼저 필요한 모듈입니다.


1

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)

확실히 확인하십시오! 작성 / 개선하는 데 수백 시간이 걸렸습니다!


1
외모 흥미로운,하지만 난에 포맷되지 않은 문서를 분리 할 수 없습니다 pypi.python.org/pypi/ez 죄송합니다 ...
그렉 Dubicki
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.