Run mpv subprocess with a system PYTHONPATH env on macOS.

youtube-dl relies on system python to run on macOS, but system
python cannot be executed in a subprocess created from the frozen
python3 executable. This makes youtube-dl unusable from frozen
versions of Syncplay on macOS. So, the environment of the mpv
subprocess is modified with system PYTHONPATH, allowing the
execution of /usr/bin/python (and hence, of youtube-dl)
from within the subprocess in frozen executables.

Fixes: #228
This commit is contained in:
Alberto Sottile 2019-03-14 15:45:55 +01:00
parent 22eec119b1
commit c07206c189

View File

@ -1,4 +1,5 @@
# coding:utf8 # coding:utf8
import ast
import os import os
import re import re
import subprocess import subprocess
@ -10,7 +11,7 @@ import time
from syncplay import constants, utils from syncplay import constants, utils
from syncplay.players.basePlayer import BasePlayer from syncplay.players.basePlayer import BasePlayer
from syncplay.messages import getMessage from syncplay.messages import getMessage
from syncplay.utils import isWindows from syncplay.utils import isMacOS, isWindows
class MplayerPlayer(BasePlayer): class MplayerPlayer(BasePlayer):
@ -338,6 +339,20 @@ class MplayerPlayer(BasePlayer):
env = os.environ.copy() env = os.environ.copy()
if 'TERM' in env: if 'TERM' in env:
del env['TERM'] del env['TERM']
# On macOS, youtube-dl requires system python to run. Set the environment
# to allow that version of python to be executed in the mpv subprocess.
if isMacOS():
try:
pythonLibs = subprocess.check_output(['/usr/bin/python', '-E', '-c',
'import sys; print(sys.path)'],
text=True, env=dict())
pythonLibs = ast.literal_eval(pythonLibs)
pythonPath = ':'.join(pythonLibs[1:])
except:
pythonPath = None
if pythonPath is not None:
env['PATH'] = '/usr/bin:/usr/local/bin'
env['PYTHONPATH'] = pythonPath
if filePath: if filePath:
self.__process = subprocess.Popen( self.__process = subprocess.Popen(
call, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, call, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT,