Je fais actuellement ma manipulation de fichiers texte à travers un tas d'AWK, sed, Bash et un tout petit peu de Perl.
J'ai vu mentionner à quelques endroits que le python est bon pour ce genre de chose. Comment puis-je utiliser Python pour remplacer les scripts shell, AWK, sed et amis?
Réponses:
Tout shell a plusieurs ensembles de fonctionnalités.
Les commandes Essential Linux / Unix. Tous ces éléments sont disponibles via la bibliothèque de sous - processus . Ce n'est pas toujours le meilleur premier choix pour exécuter toutes les commandes externes. Regardez également shutil pour certaines commandes qui sont des commandes Linux distinctes, mais vous pourriez probablement implémenter directement dans vos scripts Python. Un autre lot énorme de commandes Linux se trouve dans la bibliothèque os ; vous pouvez le faire plus simplement en Python.
Et - bonus! -- plus vite. Chaque commande Linux distincte dans le shell (à quelques exceptions près) crée un sous-processus. En utilisant Python
shutil
et desos
modules, vous ne créez pas de sous-processus.Les fonctionnalités de l'environnement shell. Cela inclut des éléments qui définissent l'environnement d'une commande (répertoire actuel et variables d'environnement et autres). Vous pouvez facilement gérer cela directement depuis Python.
Les fonctionnalités de programmation shell. Il s'agit de la vérification du code d'état du processus, des diverses commandes logiques (si, pendant, pour, etc.) de la commande de test et de toutes ses apparentées. Le truc de définition de fonction. Tout cela est beaucoup, beaucoup plus facile en Python. C'est l'une des énormes victoires en se débarrassant de bash et en le faisant en Python.
Fonctions d'interaction. Cela inclut l'historique des commandes et ce qui ne l'est pas. Vous n'en avez pas besoin pour écrire des scripts shell. C'est uniquement pour l'interaction humaine, et non pour l'écriture de scripts.
Les fonctionnalités de gestion des fichiers shell. Cela inclut la redirection et les pipelines. C'est plus compliqué. Une grande partie de cela peut être effectuée avec un sous-processus. Mais certaines choses faciles à utiliser sont désagréables en Python. Plus précisément des trucs comme
(a | b; c ) | something >result
. Cela exécute deux processus en parallèle (avec sortie dea
comme entrée pourb
), suivi d'un troisième processus. La sortie de cette séquence est exécutée en parallèle avecsomething
et la sortie est collectée dans un fichier nomméresult
. C'est juste complexe à exprimer dans une autre langue.Des programmes spécifiques (awk, sed, grep, etc.) peuvent souvent être réécrits sous forme de modules Python. N'allez pas trop loin. Remplacez ce dont vous avez besoin et faites évoluer votre module "grep". Ne commencez pas à écrire un module Python qui remplace "grep".
La meilleure chose est que vous pouvez le faire par étapes.
os.walk
. C'est une grande victoire car vous ne générez pas autant de processus.la source
find
scripts que j'ai est moche et longue et impossible à maintenir en comparaison. Beaucoup de choses devraient être des scripts shell, beaucoup d'autres non . Tout ne doit pas nécessairement être un seul de Python ou BASH (ou autre chose).(a | b; c ) | something >result
) est quelque peu atténué par le fait qu'il est trivialement facile de passer des pipelines shell à dessubprocess
méthodes utilisantshell=True
Oui bien sûr :)
Jetez un œil à ces bibliothèques qui vous aident à ne plus jamais écrire de scripts shell (la devise de Plumbum).
De plus, si vous souhaitez remplacer awk, sed et grep par quelque chose basé sur Python, je recommande pyp -
la source
Je viens de découvrir comment combiner les meilleures parties de bash et ipython. Jusqu'à présent, cela me semble plus confortable que d'utiliser un sous-processus, etc. Vous pouvez facilement copier de grandes parties de scripts bash existants et par exemple ajouter la gestion des erreurs de la manière python :) Et voici mon résultat:
Voir les documents IPython sur les commandes du shell système et son utilisation comme shell système .
la source
filelines = ! cat myfile
$var
dans une commande shell? Sensationnel. Ce devrait être la réponse acceptée.Depuis 2015 et la sortie de Python 3.4, il existe désormais un shell interactif raisonnablement complet disponible sur: http://xon.sh/ ou https://github.com/scopatz/xonsh
La vidéo de démonstration ne montre pas les canaux utilisés, mais ils SONT pris en charge en mode shell par défaut.
Xonsh ('conch') essaie très fort d'émuler bash, donc des choses pour lesquelles vous avez déjà gagné de la mémoire musculaire, comme
ou
fonctionnera toujours bien.
Le didacticiel est assez long et semble couvrir une quantité importante des fonctionnalités que quelqu'un attendrait généralement à une invite ash ou bash:
?
&??
*.xsh
scripts qui peuvent également être importés${}
$()
, Sous-processus non capturé avec$[]
, Évaluation Python avec@()
*
ou Expression régulière Globbing de nom de fichier avec backticksla source
.xsh
extension pour les fichiers avec le code xonsh : github.com/xonsh/xonsh/issues/2478 . Sinon, vous devez utiliserevalx
pour l'appeler directement à partir des.py
fichiers.la source
Au début, il y avait sh, sed et awk (et find, grep et ...). C'était bon. Mais awk peut être une petite bête étrange et difficile à retenir si vous ne l'utilisez pas souvent. Puis le grand chameau a créé Perl. Perl était le rêve d'un administrateur système. C'était comme un script shell sur les stéroïdes. Le traitement de texte, y compris les expressions régulières, n'était qu'une partie de la langue. Puis c'est devenu moche ... Les gens ont essayé de faire de grosses applications avec Perl. Maintenant, ne vous méprenez pas, Perl peut être une application, mais cela peut (peut!) Ressembler à un gâchis si vous n'êtes pas vraiment prudent. Ensuite, il y a toutes ces affaires de données plates. Il suffit de conduire un programmeur fou.
Entrez Python, Ruby et al. Ce sont vraiment de très bons langages à usage général. Ils prennent en charge le traitement de texte et le font bien (mais peut-être pas aussi étroitement liés au noyau de base de la langue). Mais ils évoluent également très bien et ont toujours un code agréable à la fin de la journée. Ils ont également développé des communautés assez lourdes avec beaucoup de bibliothèques pour presque tout.
Maintenant, une grande partie de la négativité envers Perl est une question d'opinion, et certaines personnes peuvent certainement écrire du Perl très propre, mais avec autant de gens se plaignant qu'il soit trop facile de créer du code obscurci, vous savez qu'un certain grain de vérité est là. La question devient alors vraiment, allez-vous jamais utiliser ce langage pour plus que de simples remplacements de scripts bash. Sinon, apprenez un peu plus de Perl .. c'est absolument fantastique pour ça. Si, en revanche, vous voulez un langage qui évoluera avec vous au fur et à mesure que vous en ferez plus, je vous conseille Python ou Ruby.
Quoi qu'il en soit, bonne chance!
la source
Je suggère le livre en ligne génial Dive Into Python . C'est comme ça que j'ai appris la langue à l'origine.
En plus de vous enseigner la structure de base du langage et de nombreuses structures de données utiles, il contient un bon chapitre sur la gestion des fichiers et des chapitres suivants sur les expressions régulières et plus encore.
la source
Ajout aux réponses précédentes: vérifiez le module pexpect pour gérer les commandes interactives (adduser, passwd etc.)
la source
Une des raisons pour lesquelles j'aime Python est qu'il est bien mieux standardisé que les outils POSIX. Je dois vérifier deux fois et trois fois que chaque bit est compatible avec d'autres systèmes d'exploitation. Un programme écrit sur un système Linux peut ne pas fonctionner de la même manière sur un système BSD d'OSX. Avec Python, je dois juste vérifier que le système cible a une version suffisamment moderne de Python.
Encore mieux, un programme écrit en Python standard fonctionnera même sur Windows!
la source
Je vais donner ici mon avis basé sur l'expérience:
Pour la coque:
Pour python:
Je choisis généralement bash pour la plupart des choses, mais lorsque j'ai quelque chose qui doit traverser les limites de Windows, j'utilise simplement python.
la source
pythonpy est un outil qui permet d'accéder facilement à de nombreuses fonctionnalités de awk et sed, mais en utilisant la syntaxe python:
la source
J'ai construit des scripts shell semi-longs (300-500 lignes) et du code Python qui fait des fonctionnalités similaires. Lorsque de nombreuses commandes externes sont exécutées, je trouve que le shell est plus facile à utiliser. Perl est également une bonne option lorsqu'il y a beaucoup de manipulation de texte.
la source
En recherchant ce sujet, j'ai trouvé ce code de preuve de concept (via un commentaire sur http://jlebar.com/2010/2/1/Replacing_Bash.html ) qui vous permet «d'écrire des pipelines de type shell en Python en utilisant un syntaxe laconique et tirer parti des outils système existants là où ils ont du sens ":
la source
Votre meilleur pari est un outil spécifiquement adapté à votre problème. S'il traite des fichiers texte, Sed, Awk et Perl sont les principaux concurrents. Python est un langage dynamique à usage général . Comme pour tout langage à usage général, la manipulation de fichiers est prise en charge, mais ce n'est pas son objectif principal. Je considérerais Python ou Ruby si j'avais besoin d'un langage dynamique en particulier.
En bref, apprenez très bien Sed et Awk, ainsi que tous les autres goodies qui viennent avec votre saveur de * nix (Tous les Bash intégrés, grep, tr et ainsi de suite). Si c'est le traitement de fichiers texte qui vous intéresse, vous utilisez déjà les bonnes choses.
la source
Vous pouvez utiliser python au lieu de bash avec la bibliothèque ShellPy .
Voici un exemple qui télécharge l'avatar d'un utilisateur Python depuis Github:
Comme vous pouvez le voir, toutes les expressions à l'intérieur du symbole d'accent grave (`) sont exécutées en shell. Et dans le code Python, vous pouvez capturer les résultats de cette exécution et effectuer des actions dessus. Par exemple:
Cette ligne s'exécutera d'abord
git log --pretty=oneline --grep='Create'
dans le shell, puis affectera le résultat à la variable de journal. Le résultat a les propriétés suivantes:stdout tout le texte de stdout du processus exécuté
stderr tout le texte de stderr du processus exécuté
code retour code retour de l'exécution
Ceci est un aperçu général de la bibliothèque, une description plus détaillée avec des exemples peut être trouvée ici .
la source
Si votre manipulation de fichier texte est généralement ponctuelle, éventuellement effectuée à l'invite du shell, vous n'obtiendrez rien de mieux avec python.
D'un autre côté, si vous devez généralement faire la même tâche (ou similaire) encore et encore, et que vous devez écrire vos scripts pour le faire, alors python est génial - et vous pouvez facilement créer vos propres bibliothèques (vous pouvez le faire cela avec les scripts shell aussi, mais c'est plus lourd).
Un exemple très simple pour ressentir.
Vérifiez également le module sys et getopt, ce sont les premiers dont vous aurez besoin.
la source
J'ai publié un package sur PyPI: ez .
Utilisez
pip install ez
pour l'installer.Il a emballé des commandes communes dans shell et joliment ma lib utilise fondamentalement la même syntaxe que shell. par exemple, cp (source, destination) peut gérer à la fois le fichier et le dossier! (wrapper de shutil.copy shutil.copytree et il décide quand utiliser lequel). Encore plus joliment, il peut supporter la vectorisation comme R!
Un autre exemple: pas d'os.walk, utilisez fls (path, regex) pour trouver récursivement des fichiers et filtrer avec une expression régulière et il retourne une liste de fichiers avec ou sans fullpath
Dernier exemple: vous pouvez les combiner pour écrire des scripts très simplement:
files = fls('.','py$'); cp(files, myDir)
Vérifiez-le! Cela m'a coûté des centaines d'heures pour l'écrire / l'améliorer!
la source