How to temporarily modify sys.path in Python?

2019-01-24 00:45发布

问题:

In one of my testing scripts in Python I use this pattern several times:

sys.path.insert(0, "somedir")
mod =  __import__(mymod)
sys.path.pop(0)

Is there a more concise way to temporarily modify the search path?

回答1:

You could use a simple context manager:

import sys

class add_path():
    def __init__(self, path):
        self.path = path

    def __enter__(self):
        sys.path.insert(0, self.path)

    def __exit__(self, exc_type, exc_value, traceback):
        try:
            sys.path.remove(self.path)
        except ValueError:
            pass

Then to import a module you can do:

with add_path('/path/to/dir'):
    mod = __import__('mymodule')

On exit from the body of the with statement sys.path will be restored to the original state. If you only use the module within that block you might also want to delete its reference from sys.modules:

del sys.modules['mymodule']


回答2:

Appending a value to sys.path only modifies it temporarily, i.e for that session only.

Permanent modifications are done by changing PYTHONPATH and the default installation directory.

So, if by temporary you meant for current session only then your approach is okay, but you can remove the pop part if somedir is not hiding any important modules that is expected to be found in in PYTHONPATH ,current directory or default installation directory.

http://docs.python.org/2/tutorial/modules.html#the-module-search-path