##// END OF EJS Templates
Work on ipcontroller....
Brian Granger -
Show More
@@ -25,10 +25,12 b' Notes'
25 25
26 26 import logging
27 27 import os
28
28 29 import sys
29 30 import traceback
30 31 from copy import deepcopy
31 32
33 from IPython.core import release
32 34 from IPython.utils.genutils import get_ipython_dir, filefind
33 35 from IPython.config.loader import (
34 36 PyFileConfigLoader,
@@ -42,7 +44,7 b' from IPython.config.loader import ('
42 44 #-----------------------------------------------------------------------------
43 45
44 46
45 class IPythonArgParseConfigLoader(ArgParseConfigLoader):
47 class BaseAppArgParseConfigLoader(ArgParseConfigLoader):
46 48 """Default command line options for IPython based applications."""
47 49
48 50 def _add_other_arguments(self):
@@ -77,6 +79,7 b' class Application(object):'
77 79
78 80 config_file_name = 'ipython_config.py'
79 81 name = 'ipython'
82 description = 'IPython: an enhanced interactive Python shell.'
80 83 default_log_level = logging.WARN
81 84
82 85
@@ -141,6 +144,7 b' class Application(object):'
141 144 """
142 145 self.default_config = Config()
143 146 self.default_config.Global.ipythondir = get_ipython_dir()
147 self.default_config.Global.log_level = self.log_level
144 148
145 149 def log_default_config(self):
146 150 self.log.debug('Default config loaded:')
@@ -155,7 +159,10 b' class Application(object):'
155 159
156 160 def create_command_line_config(self):
157 161 """Create and return a command line config loader."""
158 return IPythonArgParseConfigLoader(description=self.name)
162 return BaseAppArgParseConfigLoader(
163 description=self.description,
164 version=release.version
165 )
159 166
160 167 def pre_load_command_line_config(self):
161 168 """Do actions just before loading the command line config."""
@@ -332,3 +339,92 b' class Application(object):'
332 339 elif action == 'exit':
333 340 self.exit()
334 341
342
343 class AppWithDirArgParseConfigLoader(ArgParseConfigLoader):
344 """Default command line options for IPython based applications."""
345
346 def _add_other_arguments(self):
347 self.parser.add_argument('-ipythondir', '--ipython-dir',
348 dest='Global.ipythondir',type=str,
349 help='Set to override default location of Global.ipythondir.',
350 default=NoConfigDefault,
351 metavar='Global.ipythondir')
352 self.parser.add_argument('-p','-profile', '--profile',
353 dest='Global.profile',type=str,
354 help='The string name of the ipython profile to be used.',
355 default=NoConfigDefault,
356 metavar='Global.profile')
357 self.parser.add_argument('-log_level', '--log-level',
358 dest="Global.log_level",type=int,
359 help='Set the log level (0,10,20,30,40,50). Default is 30.',
360 default=NoConfigDefault)
361 self.parser.add_argument('-app_dir', '--app-dir',
362 dest='Global.app_dir',type=str,
363 help='Set the application directory where everything for this '
364 'application will be found (including the config file).',
365 default=NoConfigDefault,
366 metavar='Global.app_dir')
367
368
369 class ApplicationWithDir(Application):
370
371 name = 'appname'
372 description = 'Application: foo and bar it.'
373 config_file_name = 'appname_config.py'
374 default_log_level = logging.WARN
375
376 def create_default_config(self):
377 super(ApplicationWithDir, self).create_default_config()
378 self.default_config.Global.profile = 'default'
379 self.default_config.Global.app_dir = ''
380
381 def create_command_line_config(self):
382 """Create and return a command line config loader."""
383 return AppWithDirArgParseConfigLoader(
384 description=self.description,
385 version=release.version
386 )
387
388 def find_config_file_name(self):
389 """Find the config file name for this application."""
390 self.find_app_dir()
391 self.create_app_dir()
392
393 def find_app_dir(self):
394 """This resolves into full paths, the app directory.
395
396 This method must set ``self.app_dir`` to the full path of
397 the directory.
398 """
399 # Instead, first look for an explicit app_dir
400 try:
401 self.app_dir = self.command_line_config.Global.app_dir
402 except AttributeError:
403 self.app_dir = self.default_config.Global.app_dir
404 self.app_dir = os.path.expandvars(os.path.expanduser(self.app_dir))
405 if not self.app_dir:
406 # Then look for a profile
407 try:
408 self.profile = self.command_line_config.Global.profile
409 except AttributeError:
410 self.profile = self.default_config.Global.profile
411 app_dir_name = 'cluster_' + self.profile
412 try_this = os.path.join(os.getcwd(), app_dir_name)
413 if os.path.isdir(try_this):
414 self.app_dir = try_this
415 else:
416 self.app_dir = os.path.join(self.ipythondir, app_dir_name)
417 # These have to be set because they could be different from the one
418 # that we just computed. Because command line has the highest
419 # priority, this will always end up in the master_config.
420 self.default_config.Global.app_dir = self.app_dir
421 self.command_line_config.Global.app_dir = self.app_dir
422
423 def create_app_dir(self):
424 """Make sure that the cluster, security and log dirs exist."""
425 if not os.path.isdir(self.app_dir):
426 os.makedirs(self.app_dir, mode=0777)
427
428 def find_config_file_paths(self):
429 """Set the search paths for resolving the config file."""
430 self.config_file_paths = (self.app_dir,)
@@ -28,7 +28,7 b' import os'
28 28 import sys
29 29 import warnings
30 30
31 from IPython.core.application import Application, IPythonArgParseConfigLoader
31 from IPython.core.application import Application, BaseAppArgParseConfigLoader
32 32 from IPython.core import release
33 33 from IPython.core.iplib import InteractiveShell
34 34 from IPython.config.loader import (
@@ -283,20 +283,23 b' cl_args = ('
283 283 # # These are only here to get the proper deprecation warnings
284 284 (('-pylab',), dict(
285 285 action='store_true', dest='Global.pylab', default=NoConfigDefault,
286 help="Disabled. Pylab has been disabled until matplotlib supports this version of IPython.")
286 help="Disabled. Pylab has been disabled until matplotlib "
287 "supports this version of IPython.")
287 288 )
288 289 )
289 290
290 291
291 class IPythonAppCLConfigLoader(IPythonArgParseConfigLoader):
292 class IPythonAppCLConfigLoader(BaseAppArgParseConfigLoader):
292 293
293 294 arguments = cl_args
294 295
295 296
296 297 _default_config_file_name = 'ipython_config.py'
297 298
299
298 300 class IPythonApp(Application):
299 301 name = 'ipython'
302 description = 'IPython: an enhanced interactive Python shell.'
300 303 config_file_name = _default_config_file_name
301 304
302 305 def create_default_config(self):
@@ -313,11 +316,6 b' class IPythonApp(Application):'
313 316 # By default always interact by starting the IPython mainloop.
314 317 self.default_config.Global.interact = True
315 318
316 # Let the parent class set the default, but each time log_level
317 # changes from config, we need to update self.log_level as that is
318 # what updates the actual log level in self.log.
319 self.default_config.Global.log_level = self.log_level
320
321 319 # No GUI integration by default
322 320 self.default_config.Global.wthread = False
323 321 self.default_config.Global.q4thread = False
@@ -326,8 +324,9 b' class IPythonApp(Application):'
326 324 def create_command_line_config(self):
327 325 """Create and return a command line config loader."""
328 326 return IPythonAppCLConfigLoader(
329 description=ipython_desc,
330 version=release.version)
327 description=self.description,
328 version=release.version
329 )
331 330
332 331 def post_load_command_line_config(self):
333 332 """Do actions after loading cl config."""
@@ -540,7 +539,7 b' def load_default_config(ipythondir=None):'
540 539
541 540
542 541 def launch_new_instance():
543 """Create a run a full blown IPython instance"""
542 """Create and run a full blown IPython instance"""
544 543 app = IPythonApp()
545 544 app.start()
546 545
@@ -26,7 +26,11 b' from twisted.python import log'
26 26
27 27 from IPython.config.loader import Config, NoConfigDefault
28 28
29 from IPython.core.application import Application, IPythonArgParseConfigLoader
29 from IPython.core.application import (
30 ApplicationWithDir,
31 BaseAppArgParseConfigLoader
32 )
33
30 34 from IPython.core import release
31 35
32 36 from IPython.utils.traitlets import Int, Str, Bool, Instance
@@ -152,25 +156,22 b' cl_args = ('
152 156 (('-r','--reuse-furls'), dict(
153 157 action='store_true', dest='Global.reuse_furls', default=NoConfigDefault,
154 158 help='Try to reuse all FURL files.')
155 ),
156 (('-cluster_dir', '--cluster-dir',), dict(
157 type=str, dest='Global.cluster_dir', default=NoConfigDefault,
158 help='Absolute or relative path to the cluster directory.',
159 metavar='Global.cluster_dir')
160 ),
159 )
161 160 )
162 161
163 162
164 class IPControllerAppCLConfigLoader(IPythonArgParseConfigLoader):
163 class IPControllerAppCLConfigLoader(BaseAppArgParseConfigLoader):
165 164
166 165 arguments = cl_args
167 166
168 167
169 168 _default_config_file_name = 'ipcontroller_config.py'
170 169
171 class IPControllerApp(Application):
170
171 class IPControllerApp(ApplicationWithDir):
172 172
173 173 name = 'ipcontroller'
174 description = 'Start the IPython controller for parallel computing.'
174 175 config_file_name = _default_config_file_name
175 176 default_log_level = logging.DEBUG
176 177
@@ -178,71 +179,16 b' class IPControllerApp(Application):'
178 179 super(IPControllerApp, self).create_default_config()
179 180 self.default_config.Global.reuse_furls = False
180 181 self.default_config.Global.import_statements = []
181 self.default_config.Global.profile = 'default'
182 182 self.default_config.Global.log_dir_name = 'log'
183 183 self.default_config.Global.security_dir_name = 'security'
184 184 self.default_config.Global.log_to_file = False
185 # Resolve the default cluster_dir using the default profile
186 self.default_config.Global.cluster_dir = ''
187
188 def create_command_line_config(self):
189 """Create and return a command line config loader."""
190
191 return IPControllerAppCLConfigLoader(
192 description="Start an IPython controller",
193 version=release.version)
194
195 def find_config_file_name(self):
196 """Find the config file name for this application."""
197 self.find_cluster_dir()
198 self.create_cluster_dir()
199
200 def find_cluster_dir(self):
201 """This resolves into full paths, the various cluster directories.
202
203 This method must set ``self.cluster_dir`` to the full paths of
204 the directory.
205 """
206 # Ignore self.command_line_config.Global.config_file
207 # Instead, first look for an explicit cluster_dir
208 try:
209 self.cluster_dir = self.command_line_config.Global.cluster_dir
210 except AttributeError:
211 self.cluster_dir = self.default_config.Global.cluster_dir
212 self.cluster_dir = os.path.expandvars(os.path.expanduser(self.cluster_dir))
213 if not self.cluster_dir:
214 # Then look for a profile
215 try:
216 self.profile = self.command_line_config.Global.profile
217 except AttributeError:
218 self.profile = self.default_config.Global.profile
219 cluster_dir_name = 'cluster_' + self.profile
220 try_this = os.path.join(os.getcwd(), cluster_dir_name)
221 if os.path.isdir(try_this):
222 self.cluster_dir = try_this
223 else:
224 self.cluster_dir = os.path.join(self.ipythondir, cluster_dir_name)
225 # These have to be set because they could be different from the one
226 # that we just computed. Because command line has the highest
227 # priority, this will always end up in the master_config.
228 self.default_config.Global.cluster_dir = self.cluster_dir
229 self.command_line_config.Global.cluster_dir = self.cluster_dir
230
231 def create_cluster_dir(self):
232 """Make sure that the cluster, security and log dirs exist."""
233 if not os.path.isdir(self.cluster_dir):
234 os.makedirs(self.cluster_dir, mode=0777)
235
236 def find_config_file_paths(self):
237 """Set the search paths for resolving the config file."""
238 self.config_file_paths = (self.cluster_dir,)
239 185
240 186 def pre_construct(self):
241 187 # Now set the security_dir and log_dir and create them. We use
242 188 # the names an construct the absolute paths.
243 security_dir = os.path.join(self.master_config.Global.cluster_dir,
189 security_dir = os.path.join(self.master_config.Global.app_dir,
244 190 self.master_config.Global.security_dir_name)
245 log_dir = os.path.join(self.master_config.Global.cluster_dir,
191 log_dir = os.path.join(self.master_config.Global.app_dir,
246 192 self.master_config.Global.log_dir_name)
247 193 if not os.path.isdir(security_dir):
248 194 os.mkdir(security_dir, 0700)
@@ -255,7 +201,7 b' class IPControllerApp(Application):'
255 201 self.log_dir = self.master_config.Global.log_dir = log_dir
256 202
257 203 # Now setup reuse_furls
258 if hasattr(self.master_config.Global.reuse_furls):
204 if hasattr(self.master_config.Global, 'reuse_furls'):
259 205 self.master_config.FCClientServiceFactory.reuse_furls = \
260 206 self.master_config.Global.reuse_furls
261 207 self.master_config.FCEngineServiceFactory.reuse_furls = \
@@ -305,6 +251,8 b' class IPControllerApp(Application):'
305 251 self.main_service.startService()
306 252 reactor.run()
307 253
308 if __name__ == '__main__':
254
255 def launch_new_instance():
256 """Create and run the IPython controller"""
309 257 app = IPControllerApp()
310 258 app.start()
@@ -1,20 +1,18 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3
4 __docformat__ = "restructuredtext en"
5
6 #-------------------------------------------------------------------------------
7 # Copyright (C) 2008 The IPython Development Team
4 #-----------------------------------------------------------------------------
5 # Copyright (C) 2008-2009 The IPython Development Team
8 6 #
9 7 # Distributed under the terms of the BSD License. The full license is in
10 8 # the file COPYING, distributed as part of this software.
11 #-------------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
12 10
13 #-------------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
14 12 # Imports
15 #-------------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14
16 15
17 if __name__ == '__main__':
18 from IPython.kernel.scripts import ipcontroller
19 ipcontroller.main()
16 from IPython.kernel.ipcontrollerapp import launch_new_instance
20 17
18 launch_new_instance()
@@ -169,7 +169,7 b" if 'setuptools' in sys.modules:"
169 169 'console_scripts': [
170 170 'ipython = IPython.core.ipapp:launch_new_instance',
171 171 'pycolor = IPython.utils.PyColorize:main',
172 'ipcontroller = IPython.kernel.scripts.ipcontroller:main',
172 'ipcontroller = IPython.kernel.ipcontrollerapp:launch_new_instance',
173 173 'ipengine = IPython.kernel.scripts.ipengine:main',
174 174 'ipcluster = IPython.kernel.scripts.ipcluster:main',
175 175 'ipythonx = IPython.frontend.wx.ipythonx:main',
General Comments 0
You need to be logged in to leave comments. Login now