efb1cf5c435f1def29aa6d199f582ef9fbc5835c
[blender.git] / release / scripts / modules / bpy / __init__.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20
21 # internal blender C module
22 import _bpy
23 from _bpy import types, props, app
24
25 data = _bpy.data
26 context = _bpy.context
27
28 # python modules
29 from . import utils, path
30 from . import ops as _ops_module
31
32 # fake operator module
33 ops = _ops_module.ops_fake_module
34
35 import sys as _sys
36
37
38 def _main():
39
40     # Possibly temp. addons path
41     from os.path import join, dirname, normpath
42     _sys.path.append(normpath(join(dirname(__file__), "..", "..", "addons", "modules")))
43
44     # if "-d" in sys.argv: # Enable this to measure startup speed
45     if 0:
46         import cProfile
47         cProfile.run('import bpy; bpy.utils.load_scripts()', 'blender.prof')
48
49         import pstats
50         p = pstats.Stats('blender.prof')
51         p.sort_stats('cumulative').print_stats(100)
52
53     else:
54         utils.load_scripts()
55
56     import os
57
58     # test for X11
59     if os.environ.get("DISPLAY"):
60
61         # BSD licenced code copied from python, temp fix for bug
62         # http://bugs.python.org/issue11432, XXX == added code
63         def _invoke(self, args, remote, autoraise):
64             # XXX, added imports
65             import io
66             import subprocess
67             import time
68
69             raise_opt = []
70             if remote and self.raise_opts:
71                 # use autoraise argument only for remote invocation
72                 autoraise = int(autoraise)
73                 opt = self.raise_opts[autoraise]
74                 if opt:
75                     raise_opt = [opt]
76
77             cmdline = [self.name] + raise_opt + args
78
79             if remote or self.background:
80                 inout = io.open(os.devnull, "r+")
81             else:
82                 # for TTY browsers, we need stdin/out
83                 inout = None
84             # if possible, put browser in separate process group, so
85             # keyboard interrupts don't affect browser as well as Python
86             setsid = getattr(os, 'setsid', None)
87             if not setsid:
88                 setsid = getattr(os, 'setpgrp', None)
89
90             p = subprocess.Popen(cmdline, close_fds=True,  # XXX, stdin=inout,
91                                  stdout=(self.redirect_stdout and inout or None),
92                                  stderr=inout, preexec_fn=setsid)
93             if remote:
94                 # wait five secons. If the subprocess is not finished, the
95                 # remote invocation has (hopefully) started a new instance.
96                 time.sleep(1)
97                 rc = p.poll()
98                 if rc is None:
99                     time.sleep(4)
100                     rc = p.poll()
101                     if rc is None:
102                         return True
103                 # if remote call failed, open() will try direct invocation
104                 return not rc
105             elif self.background:
106                 if p.poll() is None:
107                     return True
108                 else:
109                     return False
110             else:
111                 return not p.wait()
112
113         import webbrowser
114         webbrowser.UnixBrowser._invoke = _invoke
115
116
117 _main()