Obecnie manipuluję plikami tekstowymi przez grupę źle zapamiętanych AWK, sed, Bash i trochę Perla.
Widziałem już kilka miejsc, w których Python nadaje się do tego rodzaju rzeczy. Jak mogę użyć Pythona do zastąpienia skryptów powłoki, AWK, sed i znajomych?
Odpowiedzi:
Każda powłoka ma kilka zestawów funkcji.
Komendy Essential Linux / Unix. Wszystkie są dostępne za pośrednictwem biblioteki podprocesów . Nie zawsze jest to najlepszy pierwszy wybór do wykonywania wszystkich poleceń zewnętrznych. Spójrz także na shutil, aby zapoznać się z niektórymi komendami, które są oddzielnymi komendami Linuksa, ale prawdopodobnie możesz je zaimplementować bezpośrednio w skryptach Pythona. Kolejna duża partia poleceń Linuksa znajduje się w bibliotece os ; możesz to zrobić po prostu w Pythonie.
I - bonus! -- szybciej. Każde osobne polecenie Linuksa w powłoce (z kilkoma wyjątkami) wywołuje podproces. Używając Pythona
shutil
ios
modułów, nie rozwidlasz podprocesu.Funkcje środowiska powłoki. Obejmuje to rzeczy, które ustawiają środowisko polecenia (bieżący katalog i zmienne środowiskowe oraz what-not). Możesz łatwo zarządzać tym bezpośrednio z Pythona.
Funkcje programowania powłoki. To jest sprawdzanie kodu statusu procesu, różne polecenia logiczne (jeśli, podczas, dla itd.) Polecenie testowe i wszyscy jego krewni. Definicja funkcji. W Pythonie jest to o wiele łatwiejsze. To jedno z wielkich zwycięstw w pozbyciu się bashu i zrobieniu tego w Pythonie.
Funkcje interakcji Obejmuje to historię poleceń i takie tam. Nie potrzebujesz tego do pisania skryptów powłoki. Dotyczy to wyłącznie interakcji międzyludzkich, a nie pisania scenariuszy.
Funkcje zarządzania plikami powłoki. Obejmuje to przekierowanie i potoki. To trudniejsze. Wiele z tego można zrobić za pomocą podprocesu. Ale niektóre rzeczy, które są łatwe w powłoce, są nieprzyjemne w Pythonie. W szczególności rzeczy takie jak
(a | b; c ) | something >result
. To uruchamia dwa procesy równolegle (z wyjściema
jako wejście dob
), a następnie trzeci proces. Dane wyjściowe z tej sekwencji są uruchamiane równolegle,something
a dane wyjściowe są gromadzone w pliku o nazwieresult
. To skomplikowane do wyrażenia w dowolnym innym języku.Określone programy (awk, sed, grep itp.) Często można przepisać jako moduły Pythona. Nie idź za burtę. Wymień to, czego potrzebujesz i rozwinąć moduł „grep”. Nie zaczynaj pisać modułu Python, który zastępuje „grep”.
Najlepsze jest to, że możesz to zrobić krok po kroku.
os.walk
. To duża wygrana, ponieważ nie spawnujesz tylu procesów.źródło
find
skryptów w języku Python, którą mam, jest brzydka, długa i niemożliwa do utrzymania w porównaniu. Wiele rzeczy powinno być skryptami powłoki, wiele innych nie . Nie wszystko musi być tylko jednym z Python lub BASH (lub cokolwiek innego).(a | b; c ) | something >result
) jest nieco złagodzony, ponieważ w prosty sposób można przekazywać rurociągi powłokowe dosubprocess
metod przy użyciushell=True
Tak oczywiście :)
Spójrz na te biblioteki, które pomogą Ci nigdy więcej nie pisać skryptów powłoki (motto Plumbum).
Ponadto, jeśli chcesz zastąpić awk, sed i grep czymś opartym na Pythonie, polecam pyp -
źródło
Właśnie odkryłem, jak połączyć najlepsze części bash i ipython. Do tej pory wydawało mi się to wygodniejsze niż używanie podprocesu i tak dalej. Możesz łatwo skopiować duże części istniejących skryptów bash i np. Dodać obsługę błędów w sposób pythonowy :) A oto mój wynik:
Zobacz dokumentację IPython dotyczącą poleceń powłoki systemowej i używania jej jako powłoki systemowej .
źródło
filelines = ! cat myfile
$var
w poleceniu powłoki? Łał. To powinna być zaakceptowana odpowiedź.Począwszy od 2015 r. I wydania Python 3.4, dostępna jest w miarę kompletna powłoka interaktywna dla użytkownika dostępna pod adresem: http://xon.sh/ lub https://github.com/scopatz/xonsh
Film demonstracyjny nie pokazuje używanych rur, ale są one obsługiwane w domyślnym trybie powłoki.
Xonsh („muszla”) bardzo mocno próbuje emulować uderzenie, więc na przykład dla rzeczy, które już zyskałeś pamięć mięśni
lub
nadal będzie działać dobrze.
Samouczek jest dość długi i wydaje się, że obejmuje znaczną część funkcjonalności, jakiej można by się spodziewać po monicie:
?
&??
*.xsh
skrypty, które można również importować${}
$()
, Uncaptured Subprocess with$[]
, Python Evaluation with@()
*
nazwy pliku z lub wyrażenie regularne Globbing nazwy pliku z backtiksemźródło
.xsh
rozszerzenia dla plików z kodem xonsh : github.com/xonsh/xonsh/issues/2478 . W przeciwnym razie musisz użyć,evalx
aby wywołać go bezpośrednio z.py
plików.źródło
Na początku było sh, sed i awk (i znajdź, grep i ...). To było dobre. Ale awk może być dziwną małą bestią i trudno ją zapamiętać, jeśli nie używasz jej często. Następnie wielki wielbłąd stworzył Perla. Perl był marzeniem administratora systemu. To było jak pisanie skryptów na sterydach. Przetwarzanie tekstu, w tym wyrażenia regularne, było po prostu częścią języka. Potem stało się brzydkie ... Ludzie próbowali tworzyć duże aplikacje za pomocą Perla. Nie zrozum mnie źle, Perl może być aplikacją, ale może (może!) Wyglądać jak bałagan, jeśli nie jesteś naprawdę ostrożny. Potem jest cały ten płaski biznes danych. Wystarczy doprowadzić do szału programisty.
Wpisz Python, Ruby i in. To naprawdę bardzo dobre języki ogólnego przeznaczenia. Obsługują przetwarzanie tekstu i robią to dobrze (choć być może nie są tak ściśle powiązane z podstawowym rdzeniem języka). Ale skalują się również bardzo dobrze i pod koniec dnia wciąż mają ładnie wyglądający kod. Stworzyli też całkiem spore społeczności z dużą ilością bibliotek dla większości czegokolwiek.
Teraz wiele negatywnych opinii na temat Perla jest kwestią opinii i na pewno niektórzy ludzie potrafią napisać bardzo czysty Perl, ale przy tak wielu ludziach narzekających na to, że zbyt łatwe jest tworzenie zaciemnionego kodu, wiesz, że jest w tym trochę ziarna prawdy. Powstaje więc pytanie: czy kiedykolwiek użyjesz tego języka do czegoś więcej niż zwykłego zastępowania skryptu bash. Jeśli nie, naucz się więcej Perla ... jest to absolutnie fantastyczne. Jeśli natomiast chcesz języka, który będzie się rozwijał wraz z tobą, aby zrobić więcej, pozwól, że zasugeruję Python lub Ruby.
Tak czy inaczej, powodzenia!
źródło
Proponuję niesamowitą książkę online Dive Into Python . Tak pierwotnie nauczyłem się języka.
Oprócz nauki podstawowej struktury języka i wielu użytecznych struktur danych, ma także dobry rozdział na temat obsługi plików i kolejne rozdziały na temat wyrażeń regularnych i wiele więcej.
źródło
Dodanie do poprzednich odpowiedzi: sprawdź moduł pexpect pod kątem obsługi poleceń interaktywnych (adduser, passwd itp.)
źródło
Jednym z powodów, dla których uwielbiam Python jest to, że jest on znacznie lepiej znormalizowany niż narzędzia POSIX. Muszę podwójnie i potrójnie sprawdzić, czy każdy bit jest zgodny z innymi systemami operacyjnymi. Program napisany w systemie Linux może nie działać tak samo w systemie BSD OSX. W Pythonie muszę tylko sprawdzić, czy system docelowy ma wystarczająco nowoczesną wersję Pythona.
Co więcej, program napisany w standardowym języku Python działa nawet w systemie Windows!
źródło
Podam tutaj moją opinię na podstawie doświadczenia:
Dla powłoki:
W przypadku python:
Zazwyczaj wybieram bash dla większości rzeczy, ale kiedy mam coś, co musi przekraczać granice systemu Windows, po prostu używam Pythona.
źródło
pythonpy to narzędzie, które zapewnia łatwy dostęp do wielu funkcji z awk i sed, ale przy użyciu składni python:
źródło
Zbudowałem półdługie skrypty powłoki (300-500 linii) i kod Pythona, który ma podobną funkcjonalność. Kiedy wykonywanych jest wiele zewnętrznych poleceń, uważam, że powłoka jest łatwiejsza w użyciu. Perl jest również dobrą opcją, gdy istnieje wiele manipulacji tekstem.
źródło
Badając ten temat, znalazłem ten kod sprawdzający koncepcję (poprzez komentarz na stronie http://jlebar.com/2010/2/1/Replacing_Bash.html ), który pozwala „pisać potokowe powłoki w Pythonie przy użyciu zwięzła składnia i wykorzystanie istniejących narzędzi systemowych tam, gdzie mają sens ":
źródło
Twój najlepszy zakład to narzędzie, które jest specjalnie dostosowane do Twojego problemu. Jeśli przetwarza pliki tekstowe, Sed, Awk i Perl są najlepszymi konkurentami. Python jest dynamiką ogólnego przeznaczenia językiem . Jak w każdym języku ogólnego przeznaczenia, istnieje możliwość manipulowania plikami, ale to nie jest jego główny cel. Rozważałbym Python lub Ruby, gdybym miał w szczególności wymóg dynamicznego języka.
Krótko mówiąc, naucz się naprawdę dobrze Sed i Awk, a także wszystkich innych dodatków, które pochodzą z Twoim gustem * nix (Wszystkie wbudowane Bash, grep, tr i tak dalej). Jeśli interesuje Cię przetwarzanie plików tekstowych, już używasz właściwych rzeczy.
źródło
Możesz używać Pythona zamiast bash z ShellPy biblioteką .
Oto przykład, który pobiera awatar użytkownika Python z Github:
Jak widać, wszystkie wyrażenia wewnątrz poważnego symbolu akcentu (`) są wykonywane w powłoce. A w kodzie Python można przechwytywać wyniki tego wykonania i wykonywać na nim działania. Na przykład:
Ten wiersz najpierw zostanie wykonany
git log --pretty=oneline --grep='Create'
w powłoce, a następnie przypisze wynik do zmiennej log. Wynik ma następujące właściwości:stdout całego tekstu z stdout wykonanego procesu
stderr cały tekst z stderr wykonanego procesu
kod powrotu kod powrotu wykonania
To jest ogólny przegląd biblioteki, bardziej szczegółowy opis z przykładami można znaleźć tutaj .
źródło
Jeśli manipulowanie plikiem tekstowym zwykle odbywa się jednorazowo, prawdopodobnie w wierszu poleceń powłoki, nie uzyskasz nic lepszego od Pythona.
Z drugiej strony, jeśli zwykle musisz wykonywać to samo (lub podobne) zadanie w kółko i musisz do tego pisać swoje skrypty, to Python jest świetny - i możesz łatwo tworzyć własne biblioteki (możesz to zrobić to również ze skryptami powłoki, ale jest to bardziej kłopotliwe).
Bardzo prosty przykład na poznanie.
Sprawdź także sys i moduł getopt, są to pierwsze potrzebne.
źródło
Opublikowałem pakiet na PyPI: ez .
Użyj,
pip install ez
aby go zainstalować.Ma spakowane typowe polecenia w powłoce i ładnie moja biblioteka lib używa zasadniczo tej samej składni co shell. np. cp (źródło, miejsce docelowe) może obsługiwać zarówno plik, jak i folder! (otoki shutil.copy shutil.copytree i decyduje, kiedy użyć). Co więcej, może wspierać wektoryzację jak R!
Kolejny przykład: brak os.walk, użyj fls (ścieżka, wyrażenie regularne), aby rekurencyjnie znajdować pliki i filtrować za pomocą wyrażeń regularnych i zwraca listę plików z pełną ścieżką lub bez niej
Ostatni przykład: możesz je połączyć, aby napisać bardzo proste skrypty:
files = fls('.','py$'); cp(files, myDir)
Zdecydowanie sprawdź to! Napisanie / ulepszenie mnie kosztowało mnie setki godzin!
źródło