2016-04-07 5 views
0

Я пытаюсь запустить все mp3-файлы в фоновом режиме, создав процесс с использованием библиотеки многопроцессорности.Процесс не заканчивается

import os 
import subprocess 
from multiprocessing import Process 

def music_player(): 

    music_folder = "/home/pi/Music/" 
    files = os.listdir(music_folder) 
    for mp3_file in files: 
     print("playing " + mp3_file) 
     p = subprocess.Popen(["omxplayer","-o","local",music_folder+mp3_file], 
          stdout = subprocess.PIPE, 
          stdin = subprocess.PIPE, 
          stderr = subprocess.PIPE) 
     print(p) 
     print(p.poll()) 
     print(p.pid) 
     p.wait() 



p = Process(target = music_player) 
print(p, p.is_alive()) 
p.start() 
print(p.pid) 
print(p, p.is_alive()) 
command = raw_input() 
if(command == "stop"): 
    print("terminating...") 
    p.terminate() 
    print(p, p.is_alive()) 
    print(p.exitcode) 

После ввода «стоп» команда завершает работу кода, но музыка все еще работает и на выполнение ps я вижу 2 процесс omxplayer который я тогда придется вручную убить через kill <pid> сделать музыку остановку.

Я ранее пробовал использовать библиотеку подпроцессов и убил процесс, используя kill() and terminate(), но та же проблема возникла.

ответ

0

Первое наблюдение, вам не нужно многопроцессорной модуль для того, что вы здесь делаете. подпроцесс предназначен для создания и управления процессами, которые будут запускать другие скрипты и программы; многопроцессорность предназначен для создания и управления процессами, которые будут вызывать код, который уже является внутренним для вашего (родительского) скрипта.

Я подозреваю, что вы видите эффект буферизации. К тому моменту, когда вы убьете этот процесс, он уже буферизует значительное количество музыки на аппаратное обеспечение (или даже буферы ОС для устройства).

Что произойдет, если вы запустите ту же программу omxplayer из вашей оболочки, но в фоновом режиме (как знак & до конца вашей Unix командной строке оболочки, чтобы подтолкнуть программу в фоновом режиме). Затем используйте команду kill в этом процессе и посмотрите, видите ли вы те же результаты.

+0

Я запускаю 'omxplayer -o local &' и я не слышу никакого звука. При запуске 'ps' я вижу процессы omxplayer, но' sudo kill 'не убивает их, они все еще появляются в последующих командах' ps'. Как еще я могу поиграть в mp3-файлы в фоновом режиме и продолжить выполнение моего оставшегося кода на Python (выше это всего лишь тестовый скрипт, который я пытаюсь заставить музыку работать в фоновом режиме и быть в состоянии остановить ее с помощью command) –

+0

Глядя на http://elinux.org/Omxplayer, я вижу, что это консольный проигрыватель, написанный с помощью какого-то цикла обработки клавиатуры. Запуск его из оболочки, в фоновом режиме, вероятно, приводит к его остановке через сигналы SIGTTIN или SIGTTOUT ... фоновые процессы, пытающиеся получить доступ к их управляющему терминалу. Возможно, вам нужно запустить это приложение под https://pexpect.readthedocs.org/en/stable/ (Python pexpect), чтобы процесс имел псевдотерминал, чтобы удовлетворить свои собственные требования к ресурсам (терминал). –