title: Automatically patching PYTHONPATH (when using Fabric tasks)
body: <p>I wrap function calls within my initialization module with a decorator that patches PYTHONPATH to add current directory to it so I can use relative imports within my modules without worrying about adding the package to PYTHONPATH explicitly (edited based on @abarnert's comments)</p>
  
  <pre><code>def patch_python_path(f):
      @wraps(f)       
      def wrap(*args, **kwargs):
          ROOT = os.pathsep.join([os.path.abspath(os.path.dirname(__file__))])
          if not os.environ.has_key("PYTHONPATH"):
              os.environ["PYTHONPATH"] = ""
          if not (ROOT in os.environ["PYTHONPATH"].split(":")):
              os.environ["PYTHONPATH"] = "%s:%s" % (os.environ["PYTHONPATH"], ROOT)
          if not ROOT in sys.path:
              sys.path.append(ROOT)
          return f(*args, **kwargs)
      return wrap
  </code></pre>
  
  <p>Here's how I use it:</p>
  
  <pre><code>@patch_python_path
  def initialize():
      #at this point any code being run has access to local modules through relative imports
      pass
  </code></pre>
  
  <p>Are there any major issues with this approach that I am not aware of?</p>
  
  <hr>
  
  <p>My objectives with this are the following:</p>
  
  <ul>
  <li>i want to have a self contained bootstrap that a user can immediately use without any additional env manipulations</li>
  <li>i also assume that a user can change the name of the bootstrap package so it's imperative that all the imports remain relative   </li>
  </ul>
  
  <p>[EDIT] I'm actually realizing that the problem I am facing has more to do with the way Fabric runs tasks as opposed to pure Python module importing. If I attempt to run a task from a python shell (as opposed to fab task1) all the imports are resolved correctly without any patching required. Running a task through fab causes import errors </p>