inkstitch/lib/debug_utils.py

85 wiersze
3.4 KiB
Python

# Authors: see git history
#
# Copyright (c) 2010 Authors
# Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details.
import os
import sys
# DEBUG file format:
# - first non-comment line is debugger type
# - valid values are:
# "vscode" or "vscode-script" - for debugging with vscode
# "pycharm" or "pycharm-script" - for debugging with pycharm
# "pydev" or "pydev-script" - for debugging with pydev
# "none" or empty file - for no debugging
# - for offline debugging without inkscape, set debugger name to
# as "vscode-script" or "pycharm-script" or "pydev-script"
# - in that case running from inkscape will not start debugger
# but prepare script for offline debugging from console
# - backward compatibilty is broken due to confusion
# debug_type = 'pydev' # default debugger backwards compatibility
# if 'PYCHARM_REMOTE_DEBUG' in os.environ: # backwards compatibility
# debug_type = 'pycharm'
# PROFILE file format:
# - first non-comment line is profiler type
# - valid values are:
# "cprofile" - for cProfile
# "pyinstrument" - for pyinstrument
# "profile" - for profile
# "none" - for no profiling
def parse_file(filename):
# parse DEBUG or PROFILE file for type
# - return first noncomment and nonempty line from file
value_type = 'none'
with open(filename, 'r') as f:
for line in f:
line = line.strip().lower()
if line.startswith("#") or line == "": # skip comments and empty lines
continue
value_type = line # first non-comment line is type
break
return value_type
def write_offline_debug_script(SCRIPTDIR):
# prepare script for offline debugging from console
# - only tested on linux
import shutil
ink_file = os.path.join(SCRIPTDIR, ".ink.sh")
with open(ink_file, 'w') as f:
f.write(f"#!/usr/bin/env bash\n\n")
f.write(f"# version: {sys.version}\n") # python version
myargs = " ".join(sys.argv[1:])
f.write(f'# script: {sys.argv[0]} arguments: {myargs}\n') # script name and arguments
# python module path
f.write(f"# python sys.path:\n")
for p in sys.path:
f.write(f"# {p}\n")
# print PYTHONPATH one per line
f.write(f"# PYTHONPATH:\n")
for p in os.environ.get('PYTHONPATH', '').split(os.pathsep):
f.write(f"# {p}\n")
# take argument that not start with '-' as file name
svg_file = " ".join([arg for arg in sys.argv[1:] if not arg.startswith('-')])
f.write(f"# copy {svg_file} to .ink.svg\n")
# check if filer are not the same
if svg_file != '.ink.svg':
shutil.copy(svg_file, f'{SCRIPTDIR}/.ink.svg') # copy file to .ink.svg
myargs = myargs.replace(svg_file, '.ink.svg') # replace file name with .ink.svg
# export INK*|PYTHON* environment variables
for k, v in sorted(os.environ.items()):
if k.startswith('INK') or k.startswith('PYTHON'):
f.write(f'export {k}="{v}"\n')
# f.write(f"# python3 -m debugpy --listen 5678 --wait-for-client inkstitch.py {myargs}\n")
f.write(f"python3 inkstitch.py {myargs}\n")
os.chmod(ink_file, 0o0755) # make file executable