【问题标题】:Using temporary workdir on python在 python 上使用临时工作目录
【发布时间】:2018-10-31 19:22:26
【问题描述】:

在 python 上是否可以像设置局部变量一样设置工作目录 (os.chdir('path'))?我的意思是,只有在调用函数时才可以使用不同的目录?

即我有:

foo_function
    |
    module1---a.json
    |         |
    |         b.csv
    |
    module2---a.json
    |          |
    |         b.csv
    module3

我想要(示例):

my_path_1 = '/module1/'
my_path_2 = '/module2/'
def foo(a,b,my_path):
    os.chdir('my_path')
    os.mkdir('csv')
    os.mkdir('json')
    shutil.move(a+'.json','json')
    shutil.move(b+'.csv','csv')

现在,如果我调用例如删除模块 3 的函数 B,只需将其删除,而不使用“my_path”的新目录来搜索模块 3(最后一次调用 foo)

【问题讨论】:

  • 所以你想要一个只对调用它的函数范围有效的chdir
  • 最好只使用os.mkdir(os.path.join(my_path, 'csv')) 而不是不断更改工作目录。
  • 我已经使用上下文管理器完成了这项工作,这可能是一个值得考虑的途径
  • 似乎没有任何理由更改当前工作目录。没有它,您可以轻松完成此任务。只需寻找使用绝对路径而不是相对路径。

标签: python database module operating-system


【解决方案1】:

您可以创建一个上下文管理器来执行此操作:

@contextlib.contextmanager
def temp_chdir(path):
    prev = os.getcwd()
    os.chdir(path)
    try:
        yield
    finally:
        os.chdir(prev)

 with temp_chdir("~/some_dir"):
    funcion_a()

或者做一个装饰器

def chdir_dec(path):

    def decorator(fn):
        @wraps(fn)
        def _fn(*args, **kwargs):
            with temp_chdir(path):
                return fn(*args, **kwargs)
        return _fn

    return decorator

# example ... 

@chdir_dec('../some_path')
def function_a():
    os.system("ls")

【讨论】:

    【解决方案2】:

    除非您必须更改目录,否则最好使用绝对路径。

    def foo(a,b,my_path):
        csv_dir = os.path.join(my_path, 'csv')
        json_dir = os.path.join(my_path, 'json')
    
        os.mkdir(csv_dir)
        os.mkdir(json_dir)
    
        shutil.move(os.path.join(my_path, a+'.json'), json_dir)
        shutil.move(os.path.join(my_path, b+'.csv'),' csv_dir)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 2021-01-05
      • 1970-01-01
      相关资源
      最近更新 更多