在我的Python测试脚本中,我多次使用此模式:
sys.path.insert(0, "somedir")
mod = __import__(mymod)
sys.path.pop(0)
有没有更简洁的方法来临时修改搜索路径?
发布于 2016-10-04 23:04:15
您可以使用一个简单的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
然后,要导入模块,您可以执行以下操作:
with add_path('/path/to/dir'):
mod = __import__('mymodule')
从with
语句体中退出时,sys.path
将恢复到原始状态。如果仅使用该块中的模块,则可能还需要从sys.modules
中删除其引用
del sys.modules['mymodule']
发布于 2013-06-20 18:19:09
向sys.path
追加一个值只会临时修改它,即仅用于该会话。
永久修改是通过更改PYTHONPATH
和默认安装目录来完成的。
因此,如果你的意思是临时的,那么你的方法是可以的,但是如果somedir
没有隐藏在PYTHONPATH
,当前目录或默认安装目录中预计会找到的任何重要模块,你可以删除pop
部件。
http://docs.python.org/2/tutorial/modules.html#the-module-search-path
发布于 2020-11-11 23:10:32
以下是Eugene Yarmash (使用contextlib
和pathlib.Path
-compatible)的contextmanager实现的替代实现:
import os
import sys
import contextlib
from typing import Iterator, Union
@contextlib.contextmanager
def add_sys_path(path: Union[str, os.PathLike]) -> Iterator[None]:
"""Temporarily add the given path to `sys.path`."""
path = os.fspath(path)
try:
sys.path.insert(0, path)
yield
finally:
sys.path.remove(path)
with add_sys_path('/path/to/dir'):
mymodule = importlib.import_module('mymodule')
https://stackoverflow.com/questions/17211078
复制相似问题