forked from cztomczak/cefpython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhelpers.pyx
More file actions
93 lines (85 loc) · 3.49 KB
/
helpers.pyx
File metadata and controls
93 lines (85 loc) · 3.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# Copyright (c) 2016 The CEF Python authors. All rights reserved.
include "cefpython.pyx"
import os
import platform
import re
import traceback
import time
import codecs
cpdef str GetModuleDirectory():
"""Get path to the cefpython module (so/pyd)."""
if platform.system() == "Linux" and os.getenv("CEFPYTHON3_PATH"):
# cefpython3 package __init__.py sets CEFPYTHON3_PATH.
# When cefpython3 is installed as debian package, this
# env variable is the only way of getting valid path.
return os.getenv("CEFPYTHON3_PATH")
if hasattr(sys, "frozen"):
path = os.path.dirname(sys.executable)
elif "__file__" in globals():
path = os.path.dirname(os.path.realpath(__file__))
else:
path = os.getcwd()
if platform.system() == "Windows":
path = re.sub(r"[/\\]+", re.escape(os.sep), path)
path = re.sub(r"[/\\]+$", "", path)
return os.path.abspath(path)
g_GetAppPath_dir = None
cpdef str GetAppPath(file=None):
"""Get application path."""
# On Windows after downloading file and calling Browser.GoForward(),
# current working directory is set to %UserProfile%.
# Calling os.path.dirname(os.path.realpath(__file__))
# returns for eg. "C:\Users\user\Downloads". A solution
# is to cache path on first call.
if not g_GetAppPath_dir:
if hasattr(sys, "frozen"):
adir = os.path.dirname(sys.executable)
else:
adir = os.getcwd()
global g_GetAppPath_dir
g_GetAppPath_dir = adir
# If file is None return current directory without trailing slash.
if file is None:
file = ""
# Only when relative path.
if not file.startswith("/") and not file.startswith("\\") and (
not re.search(r"^[\w-]+:", file)):
path = g_GetAppPath_dir + os.sep + file
if platform.system() == "Windows":
path = re.sub(r"[/\\]+", re.escape(os.sep), path)
path = re.sub(r"[/\\]+$", "", path)
return path
return str(file)
cpdef py_void ExceptHook(excType, excValue, traceObject):
"""Global except hook to exit app cleanly on error."""
# This hook does the following: in case of exception write it to
# the "error.log" file, display it to the console, shutdown CEF
# and exit application immediately by ignoring "finally" (_exit()).
print("[CEF Python] ExceptHook: catched exception, will shutdown CEF now")
QuitMessageLoop()
Shutdown()
print("[CEF Python] ExceptHook: see the catched exception below:")
errorMsg = "".join(traceback.format_exception(excType, excValue,
traceObject))
errorFile = GetAppPath("error.log")
try:
appEncoding = g_applicationSettings["string_encoding"]
except:
appEncoding = "utf-8"
if type(errorMsg) == bytes:
errorMsg = errorMsg.decode(encoding=appEncoding, errors="replace")
try:
with codecs.open(errorFile, mode="a", encoding=appEncoding) as fp:
fp.write("\n[%s] %s\n" % (
time.strftime("%Y-%m-%d %H:%M:%S"), errorMsg))
except:
print("[CEF Python] WARNING: failed writing to error file: %s" % (
errorFile))
# Convert error message to ascii before printing, otherwise
# you may get error like this:
# | UnicodeEncodeError: 'charmap' codec can't encode characters
errorMsg = errorMsg.encode("ascii", errors="replace")
errorMsg = errorMsg.decode("ascii", errors="replace")
print("\n"+errorMsg)
# noinspection PyProtectedMember
os._exit(1)