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

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

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



답변

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

  • 필수 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. 일반적인 쉘 로직 (루프, 결정 등)을 파이썬 스크립트로 대체하는 것을보십시오.

답변

예, 물론 🙂

쉘 스크립트를 다시 작성하지 않는 데 도움이되는이 라이브러리를 살펴보십시오 (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을 제안합니다 . 내가 원래 언어를 배운 방법입니다.

언어의 기본 구조와 많은 유용한 데이터 구조를 가르치는 것 외에도 파일 처리 에 대한 장과 정규 표현식 등에 대한 장이 있습니다.