subprocess shell=true

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
horko
User
Beiträge: 17
Registriert: Dienstag 1. Oktober 2013, 10:49

Hallo,
ich komm irgendwie nicht weiter mit meinen Ansätzen, ich lese überall immer wieder das man auf keinem Fall ein subprocess mit shell=true machen soll.
Was ich auch gerne würde allerdings klappt der subprocess dann nicht mehr, kann mir irgendwas sagen was ich ändern muss damit es klappt, da ich mich schon gerne daran halten würde das ganze zu vermeiden.

Code: Alles auswählen

def resize_picture(pic, path):
    pic_name = os.path.basename(pic)
    pic_name_without_ext = pic_name.rsplit('.',1)[0]
    thumb_size = '640x480'
    cmd = ('/usr/bin/convert+' '+'-quiet'+' '+'-thumbnail'+' '+str(thumb_size)+' '+'-depth 8'+' '+str(pic)+' '+path+'/.thumb/'+str(pic_name_without_ext)+'.png')
    subprocess.call(cmd, shell=True)
Genau genommen ist das schon ziemlich hässlich, das weiß ich, allerdings kenne ich kein build in was sowas könnte.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du musst es einfach so verwenden, wie es vorgesehen ist. Statt eine Anweisung als String zu übergeben, welchen du dir irgendwie zusammengeschustert hast, musst du die Anweisung einfach als Liste übergeben, welche die einzelnen Argument als Elemente enthält.

In deinem Fall also

Code: Alles auswählen

cmd = ["/usr/bin/convert", "quiet", "-thumbnail", str(thum_size), "-depth", "8", ...]
die call-Funktion kümmtert sich dann um den ganzen Rest.
Das Leben ist wie ein Tennisball.
horko
User
Beiträge: 17
Registriert: Dienstag 1. Oktober 2013, 10:49

wow so einfach, klappt, vielen dank
BlackJack

@horko: Genau genommen ist der Quelltext im ersten Beitrag syntaktisch kein Python. Das kompiliert so nicht einmal. ;-)
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@horko: und zum Dateinamen zusammensetzten gibt es os.path.join und die ganzen "str" sind alle unnötig.
Antworten