Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Bash script overzetten naar python3  (gelezen 1981 keer)

Offline BaukeP

  • Lid
Bash script overzetten naar python3
« Gepost op: 2017/06/24, 15:56:06 »
Hallo,
Ik heb de volgende regel in een bash-script. Deze geeft mij de nederlandse ondertitelingstracks in een mkv bestand.

subidn=$(ffmpeg -i "$ifile" 2>&1 | grep -e '(dut)' -e '(nld)' | awk -F: '{print $2}' | sed 's/(dut)/:/' | sed 's/(nld)/:/'| sed 's/ *$//')
Voor iets simpeler zaken heb ik het volgende gebruikt:
opdr2 = "convert '"+tmppad+"'/*.jpg "+ofile+"; rm -rf '"+tmppad+"' && rm "+ifile
    try:
        subprocess.call(opdr2, shell=True, executable='/bin/bash')
        aantalverwerkt += 1
    except:
        continue
en dat werkt al is het niet echt pythonic.

Hoe wordt het eerste stukje code in python3? Het liefst op z'n pythons ... ik moet tenslotte ook iets leren  :D

Alvast mijn hartelijke dank,

Bauke

Re: Bash script overzetten naar python3
« Reactie #1 Gepost op: 2017/06/26, 21:54:25 »
Hoe het precies python3 wordt weet ik niet maar je kunt patroonvervanging die je met sed doet ook doen met replace() in python. Of anders met regex (daarvoor moet je de module re importeren) als je reguliere expressies wil vervangen. Meer info: https://docs.python.org/3.4/howto/regex.html#search-and-replace

Bij replace() kun je de opdrachten ook 'ketenen' dus bijvoorbeeld:
o = "abc"
n = o.replace("a",  "x").replace("b",  "y").replace("c",  "z")
print(n) # Zou "xyz" moeten tonen.
Dit zou als vervanging voor sed kunnen dienen in simpele gevallen.

Overigens is er natuurlijk niet veel mis met een bashscript als dit goed werkt toch? Als je allerlei externe applicaties zoals ffmpeg wil aanroepen kan ik met voorstellen dat bash fijner werkt.

Offline MKe

  • Lid
Re: Bash script overzetten naar python3
« Reactie #2 Gepost op: 2017/06/27, 10:42:59 »
regex substitute is de python versie van sed.

import re
line = re.sub(r"\s*$", "", mijn_tekst_variable) # = sed 's/ *$//'

Offline BaukeP

  • Lid
Re: Bash script overzetten naar python3
« Reactie #3 Gepost op: 2017/07/06, 18:12:05 »
Heren bedankt en excuses voor de late reactie. Maar wat ik bedoelde is: Hoe krijg ik het bash commando in subprocess.call(ffmpeg etc) en welke opties moeten er dan bij.

Dus:
 subprocess.call(ffmpeg -i "$ifile" 2>&1 | grep -e '(dut)' -e '(nld)' | awk -F: '{print $2}' | sed 's/(dut)/:/' | sed 's/(nld)/:/'| sed 's/ *$//', shell=True, executable='/bin/bash')

Bauke

Offline MKe

  • Lid
Re: Bash script overzetten naar python3
« Reactie #4 Gepost op: 2017/07/06, 19:19:45 »
Pipes in subprocess werken alleen als de shell=True optie wordt gegeven. Dit is echter niet aan te raden.

Het kan ook op een andere manier met popen. Hier een demonstratie die ik van het internet geknipt en geplakt heb een die de Python processen uit PS haalt via een pipe naar grep:
import subprocess
import shlex
proc1 = subprocess.Popen(shlex.split('ps cat'),stdout=subprocess.PIPE)
proc2 = subprocess.Popen(shlex.split('grep python'),stdin=proc1.stdout,
                         stdout=subprocess.PIPE,stderr=subprocess.PIPE)

proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits.
out,err=proc2.communicate()
print('out: {0}'.format(out))
print('err: {0}'.format(err))
« Laatst bewerkt op: 2017/07/06, 22:46:57 door MKe »
Mijn blokkendoos blog: http://mke21.wordpress.com/

Offline BaukeP

  • Lid
Re: Bash script overzetten naar python3
« Reactie #5 Gepost op: 2017/07/06, 20:34:40 »
MKe, bedankt. Ik ga me er wat meer in verdiepen.

Bauke