commontk / AppLauncher

Simple and small program allowing to set the environment of any executable.
http://www.commontk.org
Apache License 2.0
31 stars 32 forks source link

`--ignore-rest` does not work correctly #111

Open ihnorton opened 5 years ago

ihnorton commented 5 years ago

As far as I understand, it should allow to pass further arguments only to the launched binary, but:

``` sliceruser@8192a65779e5:~/Slicer-4.9.0-2018-10-14-linux-amd64$ ./Slicer --launch ./bin/python-real --ignore-rest -h Usage Slicer [options] Options --launcher-help Display help --launcher-version Show launcher version information --launcher-verbose Verbose mode --launch Specify the application to launch --launcher-detach Launcher will NOT wait for the application to finish --launcher-no-splash Hide launcher splash --launcher-timeout Specify the time in second before the launcher kills the application. -1 means no timeout (default: -1) --launcher-load-environment Specify the saved environment to load. --launcher-dump-environment Launcher will print environment variables to be set, then exit --launcher-show-set-environment-commands Launcher will print commands suitable for setting the parent environment (i.e. using 'eval' in a POSIX shell), then exit --launcher-additional-settings Additional settings file to consider --launcher-additional-settings-exclude-groups Comma separated list of settings groups that should NOT be overwritten by values in User and Additional settings. For example: General,Application,ExtraApplicationToLaunch --launcher-ignore-user-additional-settings Ignore additional user settings --launcher-generate-exec-wrapper-script Generate executable wrapper script allowing to set the environment --launcher-generate-template Generate an example of setting file Unknown option: -- usage: ./bin/python-real [option] ... [-c cmd | -m mod | file | -] [arg] ... Try `python -h' for more information. sliceruser@8192a65779e5:~/Slicer-4.9.0-2018-10-14-linux-amd64$ ./Slicer --launch ./bin/python-real -- -h Usage Slicer [options] Options --launcher-help Display help --launcher-version Show launcher version information --launcher-verbose Verbose mode --launch Specify the application to launch --launcher-detach Launcher will NOT wait for the application to finish --launcher-no-splash Hide launcher splash --launcher-timeout Specify the time in second before the launcher kills the application. -1 means no timeout (default: -1) --launcher-load-environment Specify the saved environment to load. --launcher-dump-environment Launcher will print environment variables to be set, then exit --launcher-show-set-environment-commands Launcher will print commands suitable for setting the parent environment (i.e. using 'eval' in a POSIX shell), then exit --launcher-additional-settings Additional settings file to consider --launcher-additional-settings-exclude-groups Comma separated list of settings groups that should NOT be overwritten by values in User and Additional settings. For example: General,Application,ExtraApplicationToLaunch --launcher-ignore-user-additional-settings Ignore additional user settings --launcher-generate-exec-wrapper-script Generate executable wrapper script allowing to set the environment --launcher-generate-template Generate an example of setting file ./bin/python-real: can't open file '-h': [Errno 2] No such file or directory sliceruser@8192a65779e5:~/Slicer-4.9.0-2018-10-14-linux-amd64$ ./Slicer --launch ./bin/python-real -h Usage Slicer [options] Options --launcher-help Display help --launcher-version Show launcher version information --launcher-verbose Verbose mode --launch Specify the application to launch --launcher-detach Launcher will NOT wait for the application to finish --launcher-no-splash Hide launcher splash --launcher-timeout Specify the time in second before the launcher kills the application. -1 means no timeout (default: -1) --launcher-load-environment Specify the saved environment to load. --launcher-dump-environment Launcher will print environment variables to be set, then exit --launcher-show-set-environment-commands Launcher will print commands suitable for setting the parent environment (i.e. using 'eval' in a POSIX shell), then exit --launcher-additional-settings Additional settings file to consider --launcher-additional-settings-exclude-groups Comma separated list of settings groups that should NOT be overwritten by values in User and Additional settings. For example: General,Application,ExtraApplicationToLaunch --launcher-ignore-user-additional-settings Ignore additional user settings --launcher-generate-exec-wrapper-script Generate executable wrapper script allowing to set the environment --launcher-generate-template Generate an example of setting file usage: ./bin/python-real [option] ... [-c cmd | -m mod | file | -] [arg] ... Options and arguments (and corresponding environment variables): -B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x -c cmd : program passed in as string (terminates option list) -d : debug output from parser; also PYTHONDEBUG=x -E : ignore PYTHON* environment variables (such as PYTHONPATH) -h : print this help message and exit (also --help) -i : inspect interactively after running script; forces a prompt even if stdin does not appear to be a terminal; also PYTHONINSPECT=x -m mod : run library module as a script (terminates option list) -O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x -OO : remove doc-strings in addition to the -O optimizations -R : use a pseudo-random salt to make hash() values of various types be unpredictable between separate invocations of the interpreter, as a defense against denial-of-service attacks -Q arg : division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew -s : don't add user site directory to sys.path; also PYTHONNOUSERSITE -S : don't imply 'import site' on initialization -t : issue warnings about inconsistent tab usage (-tt: issue errors) -u : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x see man page for details on internal buffering relating to '-u' -v : verbose (trace import statements); also PYTHONVERBOSE=x can be supplied multiple times to increase verbosity -V : print the Python version number and exit (also --version) -W arg : warning control; arg is action:message:category:module:lineno also PYTHONWARNINGS=arg -x : skip first line of source, allowing use of non-Unix forms of #!cmd -3 : warn about Python 3.x incompatibilities that 2to3 cannot trivially fix file : program read from script file - : program read from stdin (default; interactive mode if a tty) arg ...: arguments passed to program in sys.argv[1:] Other environment variables: PYTHONSTARTUP: file executed on interactive startup (no default) PYTHONPATH : ':'-separated list of directories prefixed to the default module search path. The result is sys.path. PYTHONHOME : alternate directory (or :). The default module search path uses /pythonX.X. PYTHONCASEOK : ignore case in 'import' statements (Windows). PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr. PYTHONHASHSEED: if this variable is set to 'random', the effect is the same as specifying the -R option: a random value is used to seed the hashes of str, bytes and datetime objects. It can also be set to an integer in the range [0,4294967295] to get hash values with a predictable seed. ```
ihnorton commented 5 years ago

Related to #52.

It would be nice to have an implicit mode like --launch prog <all these arguments are passed to prog>. I guess this would be a breaking change, so we would need to use something other than --launch.

jcfr commented 5 years ago

-h is a "special case", looking at the SlicerLauncherSettings.ini file we have:

[General]
[...]
additionalLauncherHelpShortArgument=-h
additionalLauncherHelpLongArgument=--help
[...]

This means we should probably be ignore the additionalLauncherHelpShortArgument and additionalLauncherHelpLongArgument value when --launch is passed ?

Also, most of the argument to the launcher are namespaced (starts with --launcher-*), I think issue is specific to -h and --help.

The following calls work:

$ ./Slicer --launch ../python-install/bin/python --version
2.7.13

$ ./Slicer --launch python --version
2.7.13

$ ./Slicer --launch ../python-install/bin/python -c "import os; print(os.__file__)"
/home/jcfr/Projects/Slicer-Qt5-VTK9-RelWithDebInfo/python-install/lib/python2.7/os.pyc

$ ./Slicer --launch python -c "import os; print(os.__file__)"
/home/jcfr/Projects/Slicer-Qt5-VTK9-RelWithDebInfo/python-install/lib/python2.7/os.pyc