Попытка запустить потоковую ссылку с аргументами через PySimpleGUI, отказ в разрешении

Как указано в заголовке, я пытаюсь создать базовый графический интерфейс потоковой передачи с помощью PySimpleGUI.

У меня есть [gui.Text('Stream link:'), gui.InputText()], и куча другого кода (пока еще не реализованные варианты), который принимает ссылку на поток в качестве входных данных, и runCommand('streamlink ' + values[0] + ' best -o output.ts') для использования streamlink для загрузки потока в output.ts в лучшем качестве.

Команда запуска:

def runCommand(cmd, timeout=None, window=None):
    os.path.dirname(os.path.realpath(__file__)) 
    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    output = ''
    for line in p.stdout:
        line = line.decode(errors='replace' if (sys.version_info) < (3, 5) else 'backslashreplace').rstrip()
        output += line
        print(line)
        window.Refresh() if window else None
    retval = p.wait(timeout)
    return (retval, output)

if __name__ == '__main__':
    main()

(Что я нашел здесь)

И это работает так:

[cli][info] Found matching plugin youtube for URL
[cli][info] Available streams: audio_mp4a, audio_opus, 144p (worst), 240p, 360p, 480p, 720p, 720p60, 1080p60 (best)
[cli][info] Opening stream: 1080p60 (muxed-stream)
error: Failed to open output: output.ts ([Errno 13] Permission denied: 'output.ts')
[cli][info] Closing currently open stream...

Как видите, когда я запускаю streamlink через runCommand, появляется ошибка отказа в доступе. Я пытаюсь получить выходной файл в том же каталоге, в котором запущен скрипт .py, но я думаю, что runCommand может указывать каталог, в который у меня нет разрешения на запись.

Я не знаю, как мне указать каталог для этой команды, может ли кто-нибудь помочь?


person user11449601    schedule 22.12.2020    source источник


Ответы (1)


Я получил output.ts в том же каталоге, что и мой файл сценария. Адрес ссылки вставлен в поле ввода, затем нажмите кнопку «Перейти».

https://www.youtube.com/watch?v=yHURXBLNs_8
import os
import sys
import subprocess
import PySimpleGUI as sg

def runCommand(cmd, timeout=None, window=None):
    os.path.dirname(os.path.realpath(__file__))
    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    output = ''
    for line in p.stdout:
        line = line.decode(errors='replace' if (sys.version_info) < (3, 5) else 'backslashreplace').rstrip()
        output += line
        print(line)
        window.Refresh() if window else None
    retval = p.wait(timeout)
    return (retval, output)

layout = [[sg.Text('Stream link:'), sg.InputText(key='-INPUT-'), sg.Button('Go')]]
window = sg.Window('Title', layout)

while True:

    event, values = window.read()

    if event == sg.WINDOW_CLOSED:
        break
    elif event == 'Go':
        runCommand('streamlink ' + values['-INPUT-'] + ' best -o output.ts')

window.close()

[cli][info] Found matching plugin youtube for URL https://www.youtube.com/watch?v=yHURXBLNs_8
[cli][info] Available streams: audio_mp4a, audio_opus, 144p (worst), 240p, 360p, 480p, 720p (best)
[cli][info] Opening stream: 720p (http)
[cli][info] Stream ended
[cli][info] Closing currently open stream...

если файл там уже существует,

[cli][info] Found matching plugin youtube for URL https://www.youtube.com/watch?v=yHURXBLNs_8
[cli][info] Available streams: audio_mp4a, audio_opus, 144p (worst), 240p, 360p, 480p, 720p (best)
[cli][info] Opening stream: 720p (http)
[cli][error] File output.ts already exists, use --force to overwrite it.
[cli][info] Closing currently open stream...

Здесь runCommand требуется много времени для работы, поэтому графический интерфейс может не реагировать. Для этого предлагается многопоточность.

person Jason Yang    schedule 22.12.2020
comment
Интересно. Это не работает для меня, и я получаю ту же ошибку, что и раньше. Интересно, что-то не так с моими разрешениями. Я вошел в систему как учетная запись администратора - person user11449601; 23.12.2020