File: pyedit-products/unzipped/docetc/examples/RunCode-examples/spawner.py
#!/usr/bin/python
"""
=============================================================
test running other programs that spawn other programs
the only catches here: sys.executable may not be a Python
when PyEdit is frozen, and some spawners may need to unset
the subprocprocy's PYTHONHOME+PYTHONPATH for the Mac app;
the proxy also expects stream text to be utf8 Unicode;
to sidestep all such contraints, set your tectConfig.py's
Python exe path to a locally-installed Python, or use the
source-code version of PyEdit instead of a frozen app.exe;
=============================================================
"""
from __future__ import print_function
import os, subprocess, sys
proc = os.path.abspath('spawnee.py') # abs for system.popen
os.environ['PYTHONIOENCODING'] = 'utf8'
print('cwd:', os.getcwd())
print('exe:', sys.executable)
print('run:', proc)
print('\nSYSTEM')
os.system(proc) # need abspath on mac
print('\nPOPEN')
print(os.popen(proc).read()) # need abspath on mac
print('SUBPROCESS')
if sys.executable.lower().endswith(('python', 'python.exe', 'python3')):
# being run by a standalone python
cmdseq = [sys.executable, '-u', proc] # -u for py unbuffered (more or less)
else:
# being run by frozen subprocproxy
cmdseq = [proc]
print('cmd:', cmdseq)
# 1.5: shell should be True on Windows so that it uses filename associations,
# but False on Linux so that it doesn't just start a "python" interactive shell
doshell = sys.platform.startswith('win')
# spawn mergeall
subproc = subprocess.Popen(
cmdseq, # a string cmd may fail on Unix
shell=doshell, # see note above, platform specific
universal_newlines=False, # binary mode, manual decode/eoln
stdout=subprocess.PIPE, # capture sub's stdout here
stderr=subprocess.STDOUT) # route sub's stderr to its stdout
for line in subproc.stdout: # read stdout+stderr lines: may block this thread
print(type(line))
print('\t=>' + repr(line), line.decode('utf8').rstrip())