首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中临时修改sys.path?

如何在Python中临时修改sys.path?
EN

Stack Overflow用户
提问于 2013-06-20 18:16:01
回答 3查看 24.9K关注 0票数 32

在我的Python测试脚本中,我多次使用此模式:

代码语言:javascript
复制
sys.path.insert(0, "somedir")
mod =  __import__(mymod)
sys.path.pop(0)

有没有更简洁的方法来临时修改搜索路径?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-04 23:04:15

您可以使用一个简单的context manager

代码语言:javascript
复制
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

然后,要导入模块,您可以执行以下操作:

代码语言:javascript
复制
with add_path('/path/to/dir'):
    mod = __import__('mymodule')

with语句体中退出时,sys.path将恢复到原始状态。如果仅使用该块中的模块,则可能还需要从sys.modules中删除其引用

代码语言:javascript
复制
del sys.modules['mymodule']
票数 32
EN

Stack Overflow用户

发布于 2013-06-20 18:19:09

sys.path追加一个值只会临时修改它,即仅用于该会话。

永久修改是通过更改PYTHONPATH和默认安装目录来完成的。

因此,如果你的意思是临时的,那么你的方法是可以的,但是如果somedir没有隐藏在PYTHONPATH,当前目录或默认安装目录中预计会找到的任何重要模块,你可以删除pop部件。

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

票数 20
EN

Stack Overflow用户

发布于 2020-11-11 23:10:32

以下是Eugene Yarmash (使用contextlibpathlib.Path-compatible)的contextmanager实现的替代实现:

代码语言:javascript
复制
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')
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17211078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档