Probleme mit Parametern und Programmausführung

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
tschan
User
Beiträge: 5
Registriert: Freitag 30. März 2007, 16:10

Hallo,

im Augenblick versuche ich ein kleines Script zu schreiben, was eine Audiodatei, die mit einem lossless Codec enkodiert ist, mit dem entsprechenden Programm dekodiert und dann mit einem anderen Tool die Qualität des Ausgangsmaterials bewertet.
Das habe ich bisher:

Code: Alles auswählen

# -*- coding: utf-8 -*-

import sys,os

def get_random_string(length):
    import random
    string = ''
    for x in range(length):
        digit = random.randint(48,122)
        while (digit in range(58,65)) or (digit in range(91,97)):
            digit = random.randint(48,122)
        string = string + chr(digit)
    return string

flac_path = ur'E:\Downloads\FLAC\flac'
monkeysaudio_path = ur"e:\temp"
aucdtect_path = ur'E:\Downloads\auCDtect\auCDtect-0.8'
audio_file = os.path.abspath(sys.argv[1].decode(sys.getfilesystemencoding()))
audio_file_path = os.path.split(audio_file)[0]
flac_exe = os.path.join(flac_path,'flac.exe')
monkeysaudio_exe = os.path.join(monkeysaudio_path,'MAC.exe')
aucdtect_exe = os.path.join(aucdtect_path,'auCDtect.exe')

rand_name = get_random_string(15)
wav_file = os.path.join(audio_file_path,rand_name+'.wav')

if audio_file.endswith('.flac'):
    string = '"%s" -o "%s" -d "%s"' % (flac_exe,wav_file,audio_file)
    string = string.encode(sys.stdout.encoding)
    os.popen(string)
elif audio_file.endswith('.ape'):
    string = '"%s" "%s" "%s" -d' % (monkeysaudio_exe,audio_file,wav_file)
    string = string.encode(sys.stdout.encoding)
    os.popen(string)

#test with aucd
Sehr einfach, funktioniert aber nicht. Das Programm, das ich per os.popen aufrufe, wird scheinbar nicht gestartet.
Kann mir vielleicht jemand erklären, warum nicht?

Danke schonmal
BlackJack

Erstmal zur `get_random_string()`-Funktion: Die ist ziemlich kompliziert und ineffizient. `range()` erzeugt eine Liste mit Zahlen und der ``in``-Operator geht sequenziell durch diese Liste um zu testen ob das Element enthalten ist. In der Bedingung der ``while``-Schleife werden also für jeden Durchlauf Listen angelegt, durchgegangen und wieder "weggeworfen". Mit `random.choice()` liesse sich die Funktion so schreiben:

Code: Alles auswählen

import random
import string


def get_random_string(length):
    characters = string.ascii_letters + string.digits
    return ''.join(random.choice(characters) for dummy in xrange(length))
Für den Anwendungszweck würde sich allerdings das `tempfile`-Modul anbieten.

Kann es sein, dass die Programme etwas ausgeben? Wenn der Ausgabepuffer voll ist, müssten die Programme blockieren bis Du etwas von der Ausgabe ausliest.

Streich das Programm doch mal auf das Minimalste zusammen was immer noch Probleme bereitet.
tschan
User
Beiträge: 5
Registriert: Freitag 30. März 2007, 16:10

Also die minimalste Version wäre wohl sowas hier:

Code: Alles auswählen

# -*- coding: utf-8 -*-
import os

string = r'"E:\Downloads\FLAC\flac\flac.exe" -o "e:\temp\test.wav" -d "e:\temp\test.flac"'
bla = os.popen(string)
print bla.read()
Wenn ich denn String direkt in der Kommandozeile eingebe, funktioniert alles. Führe ich das Pythonscript aus, tut sich nichts. Er schreibt nur eine Leerzeile in die Konsole.
Antworten