Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 34 additions & 2 deletions {{ cookiecutter.format }}/{{ cookiecutter.class_name }}/main.m
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ int main(int argc, char *argv[]) {
PyObject *exc_value;
PyObject *exc_traceback;
PyObject *systemExit_code;
const char *console_output_env;
BOOL console_output;

@autoreleasepool {
// iOS doesn't export an LANG environment variable; that variable is
Expand All @@ -43,6 +45,17 @@ int main(int argc, char *argv[]) {

NSString *resourcePath = [[NSBundle mainBundle] resourcePath];

// By default, Python's stdout and stderr are written to the Apple
// system log. If BRIEFCASE_CONSOLE_OUTPUT=1 is set in the environment
// (e.g., by Briefcase when it launches the app on a physical device
// and streams the process console), write them to the process's
// real stdout and stderr instead.
console_output_env = getenv("BRIEFCASE_CONSOLE_OUTPUT");
console_output = console_output_env != NULL && strcmp(console_output_env, "1") == 0;
if (console_output) {
NSLog(@"Python stdout and stderr will be written to the console.");
}

// Generate an isolated Python configuration.
NSLog(@"Configuring isolated Python...");
PyPreConfig_InitIsolatedConfig(&preconfig);
Expand All @@ -64,8 +77,9 @@ int main(int argc, char *argv[]) {
// Isolated apps need to set the full PYTHONPATH manually.
config.module_search_paths_set = 1;
{% if cookiecutter.python_version|minor_version >= 14 -%}
// Enable the use of the system logger
config.use_system_logger = 1;
// Enable the use of the system logger, unless console output has
// been requested.
config.use_system_logger = !console_output;
{% endif -%}
// For debugging - enable verbose mode.
// config.verbose = 1;
Expand Down Expand Up @@ -166,6 +180,24 @@ int main(int argc, char *argv[]) {
Py_ExitStatusException(status);
}

{% if cookiecutter.python_version|minor_version < 14 -%}
// Python 3.13 and earlier always redirect stdout and stderr to the
// system log on iOS. If console output has been requested, restore
// the original streams, which write to file descriptors 1 and 2.
if (console_output) {
if (PyRun_SimpleString(
"import sys\n"
"if sys.__stdout__ is not None:\n"
" sys.stdout = sys.__stdout__\n"
"if sys.__stderr__ is not None:\n"
" sys.stderr = sys.__stderr__\n"
) != 0) {
crash_dialog(@"Could not redirect stdout and stderr to the console");
exit(-16);
}
}

{% endif -%}
@try {
// Adding the app_packages as site directory.
//
Expand Down
Loading