//# PythonInterpreter.h: Interface for connecting and running tasks in Python. //# Copyright (C) 2005 //# Associated Universities, Inc. Washington DC, USA. //# //# This library is free software; you can redistribute it and/or modify it //# under the terms of the GNU Library General Public License as published by //# the Free Software Foundation; either version 2 of the License, or (at your //# option) any later version. //# //# This library is distributed in the hope that it will be useful, but WITHOUT //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public //# License for more details. //# //# You should have received a copy of the GNU Library General Public License //# along with this library; if not, write to the Free Software Foundation, //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA. //# //# Correspondence concerning AIPS++ should be addressed as follows: //# Internet email: aips2-request@nrao.edu. //# Postal address: AIPS++ Project Office //# National Radio Astronomy Observatory //# 520 Edgemont Road //# Charlottesville, VA 22903-2475 USA //# //# $Id: $ #ifndef PYTHONINTERPRETER_H_ #define PYTHONINTERPRETER_H_ #include <Python.h> #include <casa/BasicSL/String.h> namespace casa { // Interface for connecting to and running tasks in Python. class PythonInterpreter { public: // Constructor. If ipythonShell is NULL, then the connection is in // standalone mode -- i.e., a new casapy instance will be created. // If ipythonShell is not NULL, it is assumed to be either an // IPython.ipapi.IPApi instance (accesible as _ip in casapy) or an // IPython.iplib.InteractiveShell object (accessible as _ip.IP in casapy). PythonInterpreter(PyObject* ipythonShell); // Destructor. ~PythonInterpreter(); // Initialize the connection. In standalone mode, creates the python // interpreter, runs casapy, and then connects to it. showLogger has no // effect if not in standalone mode. bool init(bool showLogger = true); // Run the given command in python. void command(casacore::String command); private: // Whether the connection is initialized. bool m_initialized; // Whether the connection is standalone mode or not. bool m_standalone; // Handle to the ipython shell or the standalone interpreter. PyObject* m_shell; // Returns the aips path. static casacore::String aipsPath() { #ifndef AIPSROOT char* ap = getenv("CASAPATH"); if(ap == NULL) return casacore::String(); casacore::String path(ap); unsigned int i = path.find(' '); if(i >= path.size()) return casacore::String(); else return path.substr(0, i); #else return AIPSROOT; #endif } // Returns the casapy python path. static casacore::String casapyPath() { #ifdef AIPSROOT #ifdef AIPSARCH #ifdef PYTHONVER stringstream ss; ss << AIPSROOT << '/' << AIPSARCH << "/python/" << PYTHONVER; return ss.str(); #else return casacore::String(); #endif #else return casacore::String(); #endif #else return casacore::String(); #endif } // Returns the python path. static casacore::String pythonPath() { #ifdef PYTHONROOT return casacore::String(PYTHONROOT); #else return casacore::String(); #endif } // Returns the location of the casapy.py script. static casacore::String casapyLoc() { casacore::String p = casapyPath(); if(!p.empty()) p += "/casapy.py"; return p; } }; } #endif /*PYTHONINTERPRETER_H_*/